Как ввести макеты в метод в двух шагах от тестируемого класса - PullRequest
2 голосов
/ 20 апреля 2019

Я хочу написать своего рода интеграционный тест для класса и «нижних» классов, которые он вызывает во время работы. Я хочу смоделировать соединение с базой данных, которое вызывается «нижним» классом, но я не нашел способа сделать это.

У меня есть класс, который вызывает другой класс, который вызывает базу данных через jdbcTemplate. Я хочу внедрить макет jdbcTemplate в низший класс, но мне кажется, что он внедряется в неправильный экземпляр класса. Код следует этому шаблону:

@Component
public class A {

    @AutoWired
    B b

    public String someMethod() {
        b.otherMethod();
    }

}


@Component
public class B {

    @AutoWired
    jdbcTemplate jdbctemplate

    public String otherMethod() {
        jdbctemplate.query(args);
    }

}

Тест выглядит следующим образом:

@RunWith(MockitoJUnitRunner.Silent.class)
public class aTestClass { 

    @Mock
    JdbcTemplate jdbcTemplate;

    @InjectMocks
    B b;

    @InjectMocks
    A a;

    @Test
    public void aTest() {
        a.someMethod();
    }
}

Но когда я запускаю этот тест, я получаю исключение NullPointerException в a.someMethod () - кажется, что вызываемый B-объект является нулевым.

Проблема в том, что если я буду издеваться над B, то он никогда не будет вызывать jdbcTemplate, потому что это ложно.

Кто-нибудь может пролить некоторый свет на то, как я могу внедрить макет jdbcTemplate в B-объект, который вызывается A?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2019

Если вам нужен реальный интеграционный тест:

1) Не издевайтесь над шаблоном .. издевайтесь над всем хранилищем.

2) Вам не нужно @InjectMocks в интеграционном тесте.Spring выполняет DI.

3) Поскольку это ИТ-тест, вам необходимо использовать SpringRunner.class, а не MockitoJUnitRunner.class бегун.

@RunWith(SpringRunner.class)
public class aTestClass { 

    @MockBean
    B b;

    @Autowired
    A a;

    @Test
    public void aTest() {
        a.someMethod();
    }
}

Для модульного теста просто смоделируйте B и введите A:

@RunWith(MockitoJUnitRunner.Silent.class)
public class aTestClass { 

    @Mock
    B b;

    @InjectMocks
    A a;

    @Test
    public void aTest() {
        a.someMethod();
    }
}

Не смоделируйте зависимости зависимостей в модульном тесте.Вы не должны заботиться о более низких уровнях там.

0 голосов
/ 20 апреля 2019

После DuckDuck, немного поработав, я смог заставить тест работать с инструкцией Maciejs. Сначала это не сработало, но добавив @Configuration к обоим bean-компонентам. Вот код, который работал для меня:

@RunWith(SpringRunner.class)
public class aTestClass { 

    @MockBean
    JdbcTemplate jdbcTemplate;

    @Autowired
    B b;

    @Autowired
    A a;

    @Test
    public void aTest() {
        when(jdbcTemplate.query(args)).thenAnswer(whatyouwant));
        a.someMethod();
    }

    @Configuration
    @Import(A.class)
    static class AConfig {
    }

    @Configuration
    @Import(B.class)
    static class BConfig {
    }

}

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