Какая альтернатива автопроводке при запуске класса через testNG? - PullRequest
0 голосов
/ 04 мая 2020

Я проверяю метод testValidateAB C () в ABCValidatorTest. java

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 и ниже является его классом:

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?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Чистый ответ - использовать инжектор конструктора вместо полевого. (Это хорошая идея по ряду причин, в том числе и потому, что она предотвращает несколько категорий ошибок.)

Тогда вам не понадобится какая-либо специальная поддержка 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 (тестовый DSL, работающий поверх JUnit), который делает этот вид теста очень чистым.

0 голосов
/ 04 мая 2020

Если вы хотите написать модульный тест, вы можете использовать Mocktio и параметризованный тест в Testng

@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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...