Весенний ботинок с мокито - PullRequest
0 голосов
/ 13 июня 2018

Мне нужно протестировать метод обслуживания с помощью mocking dao.А также мне нужно протестировать метод dao, чтобы узнать, работает ли метод правильно. Но я не могу интегрировать mockito с весенней загрузкой.Если я использую MockitoJUnitRunner первый тест работает, если я использую SpringJUnit4ClassRunner второй тест работает.Я также попытался использовать @MockBean вместо @Mock, но он тоже не работает.

//SpringJUnit4ClassRunner
//MockitoJUnitRunner
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class BookServiceTests {

    @Mock
    private BookDao bookDao;
    @Autowired
    private BookDao bookDao2;
    private List<Book> listOfBooks;

    @InjectMocks
    @Autowired
    private BookService bookService;

    @PersistenceContext
    private EntityManager entityManager;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testGetMostPopularBooksInService() {
        fillListOfBooks();
        when(bookDao.selectMostPopularBooks(3, 3)).thenReturn(listOfBooks);
        assertEquals(3, bookService.getMostPopularBooks(0, 3).size());
    }

    @Test
    @Transactional
    public void testSelectMostPopularBooks() {
        fillDBByBooks();
        List<Book> listOfPopularBooks = bookDao2.selectMostPopularBooks(0, 3);
        assertEquals(3, listOfPopularBooks.size());
        assertEquals("Марсианинн", listOfPopularBooks.get(0).getName());
    }

    private void fillListOfBooks() {
        Writer writer = new Writer(3, "Джек", "Лондон", "...", null);
        listOfBooks = new ArrayList<>();
        listOfBooks.add(new Book(6, "Зов предков", 1990, writer, "...",
                10, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        listOfBooks.add(new Book(8, "Зов предков", 1990, writer, "...",
                25, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        listOfBooks.add(new Book(10, "Зов предков", 1990, writer, "...",
                35, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
    }

    private void fillDBByBooks() {
        Writer writer = new Writer(28, null, null, null, null);
        entityManager.persist(new Book(0, "Огонь и вода", 1990, writer, "...",
                105, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        entityManager.persist(new Book(0, "Солнце", 1990, writer, "...",
                150, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        entityManager.persist(new Book(0, "Космос", 1990, writer, "...",
                200, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        entityManager.persist(new Book(0, "Марсианин", 1990, writer, "...",
                225, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
    }

}

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

На самом деле, аннотация ContextConfiguration не обязательна, поскольку SpringBootTest попытается найти существующую конфигурацию самостоятельно (однако, насколько я помню, она выдаст исключение, если доступно более 1 конфигурации контекста).

Более того, нет проблем с использованием фиктивных и автонастроенных компонентов, вот пример:

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

    @Autowire
    private RealBean realBean;

    @MockBean
    private BeanYouWantToMock mockedBean;

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

Однако НЕ используйте аннотацию @InjectMocks, @MockBean означает, что вы заменяете реальный бинв контексте с поддельным, так что вам не нужно вводить его куда-то, весенний контекст сделает это за вас.

0 голосов
/ 13 июня 2018

Во-первых, ваша аннотация конфигурации контекста отсутствует в тестовом классе, поэтому у вас не будет поддержки пружинных контейнеров или автоматического подключения.Это должно быть что-то вроде этого:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(
    classes = {MyApplicationConfig.class}
)

public class MyTestClass

Во-вторых, я бы не совмещал в одном и том же тестовом классе смешанные бобы и автоматические.Я не уверен, что это даже возможно.Я предлагаю вам разделить ваши тесты на два класса.Один с реальными DAO и доступной конфигурацией контекста, а другой класс только с чистыми ложными репликами.

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