Возвращаемая сущность смоделированного вызова репозитория возвращает нуль - PullRequest
0 голосов
/ 07 ноября 2019

Фрагмент кода извлекает сущность на основе параметров.

public void updateNotification(String status, Entity entity ) {
        Entity entity1 = null;
        try {
            switch (status) {
            case "AX":
                entity1 = this.Repository.findByTypeAndParams(
                        1, entity.getParam1(), entity.getParam2(),
                        entity.getParam3());
                if (entity1!= null) {
                    entity1.setCurrentStatusKey("SET");
                    updateEntity(entity1);
                } else {
                    LOGGER.debug("");
                }
                break;

Контрольный пример для приведенного выше кода:

@RunWith(SpringJUnit4ClassRunner.class)
public class ServiceTest {
    @InjectMocks
    CVService cVServiceMock;

    @Mock
    RepositoryMock repositoryMock;

     @Test
            public void testUpdateOut() {
                Entity entity1 = new Entity ();
                entity1.setType(2);
                Mockito.when(repositoryMock.findByTypeAndParams(any(Integer.class), any(String.class),
                        any(String.class), any(String.class))).thenReturn(entity1);
                cVServiceMock.updateNotification("AX", entity1);
            }

Сущность 1 всегда пуста, а не смоделированная сущность при выполнении изтестовый пример, что я тут делаю не так?

1 Ответ

0 голосов
/ 07 ноября 2019

Как сказано в другом ответе StackOverflow MariuszS о Mocking статических методах с Mockito :

Использование PowerMockito поверх Mockito.

[...]

Дополнительная информация:

PowerMockito добавляет дополнительные функции и позволяет имитировать частные методы, статические методы и т. Д.

При этом вам, возможно, следует смоделировать экземпляр Repository:

// In your test method
PowerMockito.mockStatic(Repository.class);

Не забудьте добавить аннотацию к вашему тестовому классу:

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringRunner.class) // Since you are using SpringBoot
@PrepareForTest(Repository.class)
@PowerMockIgnore({"javax.management.*", "javax.net.ssl.*", "javax.security.*"}) // Avoid certain classloading related issues, not mandatory

В моем примере Mockito.when() заменяется на PowerMockito.doReturn(...).when(...). Это может выглядеть следующим образом:

@Test
public void testUpdateOut() {
    Entity entity1 = new Entity ();
    entity1.setType(2);
    PowerMockito.mockStatic(Repository.class);

    PowerMockito.doReturn(entity1).when(
        Repository.class,
        "findByTypeAndParams", // The name of the method
        Mockito.anyInt(), // The arguments
        Mockito.anyString(),
        Mockito.anyString(),
        Mockito.anyString()
    );

    // Your test
    notificationServiceMock.updateNotification("AX", entity1);

    // And at the end of the test:
    PowerMockito.verifyStatic(); // It will verify that all statics were called one time
}

Обратите внимание, что я заменяю ваши any(Integer.class) и any(String.class) соответственно на anyInt() и anyString().

Надеюсь, это поможет!

...