我有一个带有无状态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。而且,两个bean中的System.out.println
都不打印。如何声明/模拟豆以使测试起作用?
尽管,这似乎是一个非常棘手的问题。问题很简单。您准备好了吗?
在您的DAO类中添加默认构造函数,并查看魔术作品。