繁体   English   中英

在通过 testNG 运行 class 时自动装配的替代方法是什么?

[英]What is the alternative to autowiring while running a class through testNG?

我正在验证 ABCValidatorTest.java 中的方法 testValidateABC()

ABCValidatorTest.java

public class ABCValidatorTest {

 @Test
    public void testValidateABC() {
        ABCValidator validator = new ABCValidator();
        List<String> input = Arrays.asList("0", "1234", "abcd");
        List<Boolean> expectedOutput = Arrays.asList(false, true, false);
        boolean output;

        for (int i = 0; i < input.size(); i++) {
            if (StringUtils.isNotEmpty(input.get(i))) {
                output = validator.validateABC(input.get(i));
            } else {
                output = false;
            }
            Assert.assertEquals((boolean) expectedOutput.get(i), output);

        }
    }

}

在这里,我正在创建一个 ABCValidator 的 object,下面是它的 class:

ABCValidator.java

public class ABCValidator {

    @Autowired(required = false)
    private ABCSearch abcRestClient;

    public boolean validateABC(String abc_code) {
        String response = abcRestClient.searchABCCodes(abc_code);
        boolean hasValidabc = true;
        if ((response.startsWith("null", 1)) || (response.equals("[]"))) {
            hasValidabc = false;
        }
        return hasValidabc;
    }
}

在这里,我自动连接了 ABCSearch 以获取方法 searchABCCodes()。

运行此程序时出现 NullPointerException,因为 abcRestClient 未初始化。 如何在不更改 ABCValidator.java 中的任何内容的情况下解决此问题?

干净的答案是使用构造函数注入而不是字段注入。 (出于多种原因,这是一个好主意,包括它可以防止几类错误。)

然后你不需要任何特殊的 Spring 或反射支持,只需一个普通的模拟:

@Test
public void testValidateABC() {
    ABCSearch mockRestClient = Mockito.mock(ABCSearch.class);
    ABCValidator validator = new ABCValidator(mockRestClient);
    List<String> input = Arrays.asList("0", "1234", "abcd");
    List<Boolean> expectedOutput = Arrays.asList(false, true, false);

    for (int i = 0; i < input.size(); i++) {
        when(mockRestClient.searchABCCodes(input.get(i)).thenReturn(/* the correct boolean */);
        Assert.assertEquals((boolean) expectedOutput.get(i), validator.validateABC(input.get(i)));
    }
}

请注意,您在这里所做的称为参数化测试 我对 TestNG 不是特别熟悉,但希望有支持。 我是Spock (运行在 JUnit 之上的测试 DSL)的粉丝,它使这种测试非常干净。

如果要编写单元测试,可以在 Testng 中使用 Mocktio 和参数化测试

@RunWith(MockitoRunner.class)
public class ABCValidatorTest {

    @Mock
    private ABCSearch search;

    @DataProvider(name = "dataSet")
    public static Object[][] createdataSet() {
        return new Object[][] { { "one", true }, { "three", true }, { "four", true }, { "five", true }, };
    }

    @Test(dataProvider = "dataSet")
    public void testValidateABC(String input, Boolean expectedResult) {
        ABCValidator validator = new ABCValidator();
        Whitebox.setInternalState(validator, "abcRestClient", search);
        output = validator.validateABC(input);
        Assert.assertEquals(expectedResult, output);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM