Мокито в весенних сапогах не издевается - PullRequest
1 голос
/ 09 июля 2019

У меня есть простой тестовый пример, для которого я использую Mockito в приложении весенней загрузки.

userOperation.java

...
@Autowired
Validator nameValidator;

private boolean userOperation(String name) {
    NameStats nameStats = nameValidator.validate(name);
    if (!nameStats.isSuccess()) {
        throw new Exception();
    }
    return true;
}
...

Validator.java

public NameStats validate(String name)
{
    NameStats nameStats = new NameStats();
    // code goes here
    return nameStats;
}

testCase.java

...
@SpringBootTest
@RunWith(SpringRunner.class)
public class ImportFileOperationTest {

    @Mock
    Validator nameValidator;

    @Mock
    NameStats nameStats;

    @InjectMocks
    UserOperation operation;

    @Test
    public void  ConnectorDelegate0Test() {
        Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);
        Mockito.when(nameStats.isSuccess()).thenReturn(true);
        operation.userOperation(restConsumerRequest);
    }

}
...

Ошибка:

Для приведенного выше теста я получаю исключение NullPointerException. Во время трассировки я обнаружил, что ниже строка кода в тесте возвращает нулевое значение.

Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);

Из-за нулевого значения, когда он пытается вызвать nameStats.isSuccess(), он выбрасывает nullpointexception, даже если я смоделировал ответ на эту функцию как true.

Вопрос: 1. Правильно ли я высмеиваю ответ? 2. Почему насмешная функция возвращает нулевой объект?

Обновление:

testCase.java

@SpringBootTest
@RunWith(SpringRunner.class)
public class ImportFileOperationTest {

    @MockBean
    Validator nameValidator;

    NameStats nameStats;

    @InjectMocks
    @Resource
    UserOperation operation;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void  ConnectorDelegate0Test() {
        nameStats = new nameStats();
        Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);
        Mockito.when(nameStats.isSuccess()).thenReturn(true);
        operation.userOperation(restConsumerRequest);
    }

}

Я пытался создать объект nameStats вручную и ожидал, что функция validate возвратит этот объект, но все равно он возвращает null.

Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Испытание должно проводиться с помощью Mockito или Spring. Пружинный привод будет иметь аннотации на уровне класса @SpringBootTest и @RunWith(SpringRunner.class), а макеты будут объявлены с @MockBean или будут явно созданы с Mockito.initMocks. Испытание на основе мокито будет иметь @RunWith(MockitoJUnitRunner.class), а макеты будут объявлены с @Mock и / или введены с @InjectMocks. Обратите внимание, что внедрение не помогает, когда экземпляр, такой как NameStats, создается с new внутри метода.

Показанный тест не обязательно должен быть @SpringBootTest, и, следовательно, его можно записать как тест, управляемый Mockito следующим образом:

@RunWith(MockitoJUnitRunner.class)
public class ImportFileOperationTest {

@Mock
Validator nameValidator;

@InjectMocks
UserOperation operation;

@Test
public void  connectorDelegateTest() {
    NameStats nameStats = new NameStats();
    nameStats.setStats(Stats.SUCCESS);
    Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);

    operation.userOperation(restConsumerRequest);
}
1 голос
/ 10 июля 2019

Необходимо использовать @InjectMocks для всех типов классов и @Mock для всех связанных атрибутов внутри этого класса.

Пример:

 class Product {

 ProductDetails  productDetails;

 }

 class ProductDetails {

 }

Пример тестового примерадля вышеуказанного класса:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ProductTest {

    @Mock
    ProductDetails productDetails;

    @InjectMocks
    Product product;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...