Mockito for REST + DAO对象

时间:2014-07-21 20:46:09

标签: java rest junit mockito

这是我端到端测试的模拟代码:

@RunWith(MockitoJUnitRunner.class)
public class testRest extends Jersey Test{
DAOFactory mockDAOfactory;
RPRestrictionReasonDAO fakeDao;

@Before
public void init() {
    mockDAOfactory = mock(DAOFactory.class);
    fakeDao = mock(RPRestrictionReasonDAO.class);
}
@Test
public void testServiceWorks() throws Exception {
//Assuming I hav already initialized restrictReasons with a dummy value
when(fakeDao.findAll()).thenReturn(restrictReasons);
when(mockDAOfactory.getRPRestrictionReasonDAO()).thenReturn(fakeDao);
String response = client().resource("http://localhost:9998/")
            .path("EmployerDetails/PossibleRestrictions")
            .get(String.class);
    System.out.println("Response is " + response.toString());
}
}

每当我这样做时,我总是在我的数据库而不是restrictReasons中获得ACTUAL结果。我已经尝试过所有博客,但似乎没有任何帮助。我怎么绕过这个? lemme know如果我需要发布更多代码。

注意:我在使用Grizzly容器扩展Jersey Test时实现了这些方法。

2 个答案:

答案 0 :(得分:3)

从我的代码中可以看出,您正在创建模拟但实际上并未在客户端/服务器实现中使用模拟。

要使模拟工作,它需要由底层实现使用,而不仅仅是在测试类中创建。在这种情况下,假设您的测试在与您要测试的服务器相同的JVM中运行,您需要将创建的模拟注入依赖它们的类中。

@inkalimeva的另一个答案是试图通过将模拟注入您的DAO工厂来解决这个问题。您可以通过将DAOFactory声明更改为使用的具体类而不是抽象类来修复您遇到的错误。

E.g。

@InjectMocks
DAOFactoryImpl mockFactory;

假设DAOFactoryImpl是您的具体工厂类。

答案 1 :(得分:1)

尝试使用注释注入模拟。

@RunWith(MockitoJUnitRunner.class)
public class testRest extends Jersey Test {
    @InjectMocks
    DAOFactory mockDAOfactory;
    @Mock
    RPRestrictionReasonDAO fakeDao;

    @Before
    public void init() 
        //Do nothing
        //mockDAOfactory = mock(DAOFactory.class);
        //fakeDao = mock(RPRestrictionReasonDAO.class);
    }

    @Test
    public void testServiceWorks() throws Exception {
        //Assuming I hav already initialized restrictReasons with a dummy value
        when(fakeDao.findAll()).thenReturn(restrictReasons);
        when(mockDAOfactory.getRPRestrictionReasonDAO()).thenReturn(fakeDao);
        String response = client().resource("http://localhost:9998/")
                .path("EmployerDetails/PossibleRestrictions")
                .get(String.class);
        System.out.println("Response is " + response.toString());
    }
}