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

标签 java junit mockito ejb

我有一个带有无状态 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/

相关文章:

java - 在 DispatcherServlet 中未找到名称为 '' 的 URI [/api/encodedurl] 的 HTTP 请求的映射

java - 减少大量字符串的垃圾收集器开销

java - LibGdx 如何使用 OrthographicCamera 滚动?

java - 如何为接口(interface)编写junit测试?

java - 如何使用 junit mockito 覆盖匿名类重写方法

java - 我如何使用 powermock stub Instant 对象

java - 模拟实例触发事件

java-apns INVALID_TOKEN 响应

java - 使用 PDPageContentStream.drawLine 时出现 pdfbox 错误

android - 尝试在 Eclipse 中运行 Android JUnit 测试失败?