使用Mockito实现Junits

时间:2015-09-08 06:57:06

标签: java spring unit-testing junit mockito

我正在尝试为网络服务编写Junits。网络服务通过3层实现。

Webservice - >实施层 - >道层。

实现层实际上将DAO对象转换为业务对象并将其传递回服务。

我的目标是为服务层编写Junits。现在,为了实现这一点,我使用@Mock和@InjectMocks模拟实现层中的值,因为实现层使用spring注释字段。但每次测试时我都会得到一个空指针异常。以下是代码

服务层

@Override
    public FicheSolvaDetailDTO consulterFicheSolvabiliteTriennale(Long numFicheSolva) throws MetierException, TechniqueException {
        try {

            LOGGER.info("Consultation de la fiche de solvabilité triennale n° " + numFicheSolva);
            return boToMessageConverter.convertFicheSolvabiliteDetaillee(manager.consulterFicheSolvabiliteTriennale(numFicheSolva));

        } catch (com.accord.contrat.business.exception.MetierException e) {
            throw new MetierException(e.getMessage(), e);
        } catch (com.accord.contrat.business.exception.TechniqueException e) {
            throw new TechniqueException(e.getMessage(), e);
        }
    }

然后进入下一层。

@Override
    public FicheSolvaDetailDTO consulterFicheSolvabiliteTriennale(Long numFicheSolva) throws MetierException, TechniqueException {
        try {

            LOGGER.info("Consultation de la fiche de solvabilité triennale n° " + numFicheSolva);
            return boToMessageConverter.convertFicheSolvabiliteDetaillee(manager.consulterFicheSolvabiliteTriennale(numFicheSolva));

        } catch (com.accord.contrat.business.exception.MetierException e) {
            throw new MetierException(e.getMessage(), e);
        } catch (com.accord.contrat.business.exception.TechniqueException e) {
            throw new TechniqueException(e.getMessage(), e);
        }
    }

现在出现了DAO Layer,我没有发布。

测试类:

@RunWith(MockitoJUnitRunner.class)
public class SolvabiliteWSImplTest {
    @InjectMocks
    private static SolvabiliteWSImpl mockedSolvabiliteWSImpl;
    private static FicheSolvabiliteDetailBO ficheSolvabiliteDetailBO;

    @Mock
    IFicheSolvaManager managera;
    @Mock
    BOToMessageConverter boToMessageConverter;

    @Mock
    MessageToBOConverter messageToBo;

     @Before
    public void initMocks(){
            MockitoAnnotations.initMocks(this);
        }

    @Before
    public void setUp() throws MetierException, TechniqueException{

        ficheSolvabiliteDetailBO = new FicheSolvabiliteDetailBO();
        ficheSolvabiliteDetailBO.setCodeSituationFamilialeSouscripteur("1");
        ficheSolvabiliteDetailBO.setCodeSituationLocativeFoyer("1");
        ficheSolvabiliteDetailBO.setNumCommercant(705l);
        ficheSolvabiliteDetailBO.setNumEngagement(44686301l);
        ficheSolvabiliteDetailBO.setNumFicheSolva(138553l);

        when(managera.consulterFicheSolvabiliteTriennale(138553l)).thenReturn(ficheSolvabiliteDetailBO);

    }



    @Test
    public void testConsulterFicheSolvaDetailDTO() throws MetierException, TechniqueException{
        long numFicheSolve = 138553l;
        assertNotNull(mockedSolvabiliteWSImpl.consulterFicheSolvabiliteTriennale(numFicheSolve));
}

但它没有嘲笑价值,如

当(managera.consulterFicheSolvabiliteTriennale(138553升))thenReturn(ficheSolvabiliteDetailBO)。

当调用上面的方法时,它应该返回ficheSolvabiliteDetailBO。但函数进一步进入这个方法,然后给我空指针异常,这意味着它不是嘲笑?

请建议一种可行的测试方法。

2 个答案:

答案 0 :(得分:2)

a)你有

@InjectMocks
private static SolvabiliteWSImpl mockedSolvabiliteWSImpl;

在静态字段上。这不起作用 - 将其更改为实例字段。无论如何,JUnit都会为每次测试运行创建一个新实例。

b)你不需要

MockitoAnnotations.initMocks(this);

当你使用

@RunWith(MockitoJUnitRunner.class)

只是其中一个。正如@ crea1所写 - @Before s的顺序未确定,因此最好只删除MockitoAnnotations.initMocks(this);

答案 1 :(得分:0)

您有多种@Before方法。 JUnit不能保证在initMocks()之前调用setUp()。因此,Mock可能尚未在setUp()方法中初始化。最好有一个像这样的@Before方法来保证模拟初始化:

@Before
public void setUp() throws MetierException, TechniqueException {
    MockitoAnnotations.initMocks(this);

    ficheSolvabiliteDetailBO = new FicheSolvabiliteDetailBO();
    ficheSolvabiliteDetailBO.setCodeSituationFamilialeSouscripteur("1");
    ficheSolvabiliteDetailBO.setCodeSituationLocativeFoyer("1");
    ficheSolvabiliteDetailBO.setNumCommercant(705l);
    ficheSolvabiliteDetailBO.setNumEngagement(44686301l);
    ficheSolvabiliteDetailBO.setNumFicheSolva(138553l);

    when(managera.consulterFicheSolvabiliteTriennale(138553l)).thenReturn(ficheSolvabiliteDetailBO);

}