Вы не должны использовать один модульный тест для проверки обоих классов. У вас должно быть два тестовых класса для их проверки.
Например,
@RunWith(MockitoJUnitRunner.class)
public class EjbBusinessTest {
@InjectMocks
private EjbBusiness biz;
@Mock
private EjbDAO dao;
@Test
public void testAdd2() {
// this would return the testing connection
Mockito.doReturn(null).when(dao).getConnFromPool();
Mockito.doReturn(5).when(dao).add2();
int i = biz.add2(3);
assertThat(5).isEqualTo(i);
}
}
В вышеприведенном классе мы тестируем только метод EjbBusinessTest.add2
, и нам все равно, что происходит или если метод EjbDAO.add2
работает правильно. При этом все, что нас должно волновать, - работает ли тестируемый метод должным образом, поэтому мы высмеиваем все, что является внешним по отношению к этому методу.
Следуя аналогичному подходу и для EjbDAO.add2
, тестовый пример должен выглядеть примерно так, как показано ниже. Я также сделал метод EjbDAO.getConnection
закрытым, чтобы его также включали в тест. Этот выбор должен быть сделан вами, если вам нужно сделать его приватным или публичным c. Если вы решите сохранить его в открытом доступе c, тогда вам следует использовать @Spy для EjbDAO
и высмеивать метод EjbDAO.getConnection
.
@RunWith(MockitoJUnitRunner.class)
public class EjbDAOTest {
//instantiate this object the way you want. Mock the external objects used inside this like the library used to get connection inside EjbDAO.getConnection() Method
@InjectMocks
private EjbDAO dao;
@Test
public void testAdd2() {
// I would suggest you to make the getConnection method private.
// do not mock the getConnection here, instead mock how you are getting the connection inside the getConnection method.
int i = dao.add2(3);
assertThat(5).isEqualTo(i);
}
}
Надеюсь, это поможет.