在JUnit / Mockito测试中注入bean返回零

问题描述 投票:0回答:1

我有一个带有无状态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都不打印。如何声明/模拟豆以使测试起作用?

java junit mockito ejb
1个回答
0
投票

尽管,这似乎是一个非常棘手的问题。问题很简单。您准备好了吗?

在您的DAO类中添加默认构造函数,并查看魔术作品。

© www.soinside.com 2019 - 2024. All rights reserved.