[英]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.