java test教學 - 斷言一個對像是一個特定的類型





unit example (4)


JUnit 5的解決方案

該文件說:

但是,JUnit Jupiter的org.junit.jupiter.Assertions類不提供assertThat()方法,類似JUnit 4的org.junit.Assert類中的方法,它接受Hamcrest Matcher 。 相反,鼓勵開發人員使用由第三方斷言庫提供的對匹配器的內置支持。

Hamcrest示例:

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.jupiter.api.Test;

class HamcrestAssertionDemo {

    @Test
    void assertWithHamcrestMatcher() {
        SubClass subClass = new SubClass();
        assertThat(subClass, instanceOf(BaseClass.class));
    }

}

AssertJ示例:

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

class AssertJDemo {

    @Test
    void assertWithAssertJ() {
        SubClass subClass = new SubClass();
        assertThat(subClass).isInstanceOf(BaseClass.class);
    }

}

是否有可能在JUnit中聲明一個對像是一個類的實例? 由於各種原因,我在我的測試中有一個對象,我想檢查類型。 它是一種Object1還是一種Object2?

目前我有:

assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);

這有效,但我想知道是否有更具表現力的方式來做到這一點。

例如:

assertObjectIsClass(myObject, Object1);

我可以這樣做:

assertEquals(myObject.class, Object1.getClass());

是否有一個特定的斷言方法,允許我以更優雅,流暢的方式測試一個對象的類型?




您可以使用assertThat方法和JUnit附帶的Matchers。

看看這個鏈接 ,它描述了一些關於JUnit Matchers的內容。

例:

public class BaseClass {
}

public class SubClass extends BaseClass {
}

測試:

import org.junit.Test;

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;

/**
 * @author maba, 2012-09-13
 */
public class InstanceOfTest {

    @Test
    public void testInstanceOf() {
        SubClass subClass = new SubClass();
        assertThat(subClass, instanceOf(BaseClass.class));
    }
}



既然assertThat哪個是舊的答案現在已被棄用,我發布了正確的解決方案:

assertTrue(objectUnderTest instanceof TargetObject);




你是對的,@ RequestBody帶註釋的參數應該保存請求的整個主體並綁定到一個對象,所以你基本上必須使用你的選項。

如果您絕對需要自己的方法,可以使用自定義實現:

說這是你的json:

{
    "str1": "test one",
    "str2": "two test"
}

你想把它綁定到這兩個參數:

@RequestMapping(value = "/Test", method = RequestMethod.POST)
public boolean getTest(String str1, String str2)

首先使用JSON路徑定義自定義註釋,比如說@JsonArg ,就像所需信息的路徑一樣:

public boolean getTest(@JsonArg("/str1") String str1, @JsonArg("/str2") String str2)

現在編寫一個Custom HandlerMethodArgumentResolver ,它使用JsonPath定義的JsonPath來解析實際的參數:

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.IOUtils;
import org.springframework.core.MethodParameter;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import com.jayway.jsonpath.JsonPath;

public class JsonPathArgumentResolver implements HandlerMethodArgumentResolver{

    private static final String JSONBODYATTRIBUTE = "JSON_REQUEST_BODY";
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(JsonArg.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        String body = getRequestBody(webRequest);
        String val = JsonPath.read(body, parameter.getMethodAnnotation(JsonArg.class).value());
        return val;
    }

    private String getRequestBody(NativeWebRequest webRequest){
        HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
        String jsonBody = (String) servletRequest.getAttribute(JSONBODYATTRIBUTE);
        if (jsonBody==null){
            try {
                String body = IOUtils.toString(servletRequest.getInputStream());
                servletRequest.setAttribute(JSONBODYATTRIBUTE, body);
                return body;
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return "";

    }
}

現在只需使用Spring MVC進行註冊即可。 有點涉及,但這應該干淨利落。





java unit-testing junit