我有一个带有无状态 EJB 的 JavaEE 应用程序,用于业务逻辑 (EjbBusiness
) 和数据库访问 (EjbDAO
)。我需要在 EjbBusiness
上运行单元测试,但 DAO 方法始终返回零。
在下面的示例中,我有两个类和单元测试。我模拟连接到数据库的 EjbDAO
方法,以返回测试 SQL 连接:
@Stateless
public class EjbDAO {
public Connection getConnFromPool() {
Connection conn = null; // in production this would return a connection
return conn;
}
public int add2(int i) {
Connection conn = getConnFromPool();
System.out.println("in EjbDAO: " + i);
return i + 2;
}
}
@Stateless
public class EjbBusiness {
@Inject
private EjbDAO dao;
public int add2(int i) {
int j = dao.add2(i);
System.out.println("in EjbBusiness: " + j);
return j;
}
}
由于我模拟了EjbDAO的其中一个方法,所以我在UnitTest
中用@Spy注释它:
@RunWith(MockitoJUnitRunner.class)
public class UnitTest {
@InjectMocks
private EjbBusiness biz;
@InjectMocks
@Spy
private EjbDAO dao;
@Before
public void setup() {
dao = Mockito.mock(EjbDAO.class);
biz = Mockito.mock(EjbBusiness.class);
MockitoAnnotations.initMocks(this);
}
@Test
public void testBean() {
// this would return the testing connection
Mockito.doReturn(null).when(dao).getConnFromPool();
int i = biz.add2(3);
assertThat(5).isEqualTo(i);
}
}
问题是断言不起作用,因为 biz.add2(3)
返回零而不是 5。此外,两者中的 System.out.println
beans 未打印。如何声明/模拟 bean 以使测试正常工作?
最佳答案
仅在调用实际方法时才使用@InjectMocks
,否则请勿使用它。并且不要同时使用 @InjectMocks
和 Mockito.mock() 或 @Mock
。
在您的代码中,您在 dao
对象上使用 @InjectMocks
,并且您还为此创建了模拟。当您想要 stub 方法调用而不是调用实际方法时,请使用 Mockito.mock()
。
System.out.println()
在您的代码中不起作用,因为您为对象 biz
和 dao
创建了模拟。当您使用模拟对象调用时,实际方法(即 add2()
因此您将得到 0
作为输出)不会执行。
有关何时使用@InjectMocks
的更多信息,请参阅
this
@RunWith(MockitoJUnitRunner.class)
public class UnitTest {
@InjectMocks
private EjbBusiness biz;
@Mock
private EjbDAO dao;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testBean() {
// this would return the testing connection
Mockito.doReturn(null).when(dao).getConnFromPool();
Mockito.doCallRealMethod().when(dao).add2(Mockito.anyInt());
int i = biz.add2(3);
assertThat(i).isEqualTo(5);
}
}
关于java - 在 JUnit/Mockito 测试中注入(inject) bean 返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61149740/