gpt4 book ai didi

java - 在 JUnit/Mockito 测试中注入(inject) bean 返回零

转载 作者:行者123 更新时间:2023-12-02 00:57:29 31 4
gpt4 key购买 nike

我有一个带有无状态 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,否则请勿使用它。并且不要同时使用 @InjectMocksMockito.mock() 或 @Mock

在您的代码中,您在 dao 对象上使用 @InjectMocks ,并且您还为此创建了模拟。当您想要 stub 方法调用而不是调用实际方法时,请使用 Mockito.mock()

System.out.println() 在您的代码中不起作用,因为您为对象 bizdao 创建了模拟。当您使用模拟对象调用时,实际方法(即 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com