使用mockito和testNG测试服务

时间:2013-09-18 07:17:08

标签: java maven testng mockito

我正在尝试测试服务,这是一段代码:

@Test
    public void comprovarCercaBuuida(){
        /*Objecte que contindrà l'info de la cerca*/
        DeuteBackBean deuteBB;

        List<IDeute> respostaDeutesExe = new ArrayList<IDeute>();
        List<IDeute> respostaDeutesVol = new ArrayList<IDeute>();
        List<IDeute> respostaDeutesTots = new ArrayList<IDeute>();

        /*tot els paràmetres del servei s'han de passar com a mockito!!!*/
        Mockito.when(serveiGpt.obtenirDeutes(Mockito.eq(CLAU_SUBJECTE_BUIT),Mockito.eq(E_TIPUS_DEUTE_HIS),Mockito.eq(PERIODE_DEUTE_EXE))).thenReturn(respostaDeutesExe);
        Mockito.verify(serveiGpt,Mockito.atLeastOnce()).obtenirDeutes(Mockito.eq(CLAU_SUBJECTE_BUIT), Mockito.eq(E_TIPUS_DEUTE_HIS), Mockito.eq(PERIODE_DEUTE_EXE));

        Mockito.when(serveiGpt.obtenirDeutes(Mockito.eq(CLAU_SUBJECTE_BUIT),Mockito.eq(E_TIPUS_DEUTE_HIS),Mockito.eq(PERIODE_DEUTE_VOL))).thenReturn(respostaDeutesVol);
        //Mockito.verify(serveiPersones,Mockito.atLeastOnce()).cercarPersones(Mockito.eq(PATRO_CERCA_AMB_RESULTATS), Mockito.any(IPager.class));
        Mockito.when(serveiGpt.obtenirDeutes(Mockito.eq(CLAU_SUBJECTE_BUIT),Mockito.eq(E_TIPUS_DEUTE_HIS),Mockito.eq(PERIODE_DEUTE_TOTS))).thenReturn(respostaDeutesTots);
        //Mockito.verify(serveiPersones,Mockito.atLeastOnce()).cercarPersones(Mockito.eq(PATRO_CERCA_AMB_RESULTATS), Mockito.any(IPager.class));
}

但是我发现了maven的这个例外: Ť

ests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 3.998 sec <<< FAILURE!
comprovarCercaBuuida(cat.base.gpt.ui.ConsultaDeutesTest)  Time elapsed: 0.078 sec  <<< FAILURE!
Wanted but not invoked:
iGptService.obtenirDeutes(
    cat.base.tip.domini.impl.ClauSubjecte@1f,
    HISTORIC,
    EXECUTIVA
);
-> at cat.base.gpt.ui.ConsultaDeutesTest.comprovarCercaBuuida(ConsultaDeutesTest.java:114)
Actually, there were zero interactions with this mock.

        at cat.base.gpt.ui.ConsultaDeutesTest.comprovarCercaBuuida(ConsultaDeutesTest.java:114)

我真的不明白我做错了什么。

代码@beforMethod

@BeforeMethod
public void prepararDadesResposta(){
        IDeute dExe, dVol;
        context = new MockExternalContext();
        respostaDeutesExe = Collections.synchronizedList(new ArrayList<IDeute>());
        respostaDeutesVol = Collections.synchronizedList(new ArrayList<IDeute>());
        respostaDeutesTots = Collections.synchronizedList(new ArrayList<IDeute>());

    long start = System.currentTimeMillis();
    long end = start + 1000; 
        while (System.currentTimeMillis() < end){
            dExe = new Deute();
            dExe.setAdrecaCompletaCom("Això és un prova.");
            dExe.setAdrecaCompletaTrib("Això és un prova.");
            dExe.setCarrerTrib("Això és un prova.");
            dExe.setCasaTrib("Això és un prova.");
            dExe.setClauDeute(null);
            dExe.setClauObjecte("clauObjecte");
            dExe.setDataTerminiFi(new Date());
            dExe.setDataTerminiIni(new Date());
            dExe.setDesEns("descripcioEns");
            dExe.setDesExp("descripcióExp");
            dExe.setDesTribEn("english");
            dExe.setDesTribEs("spanish");
            dExe.setDesTributCa("catalan");
            dExe.setEscalaTrib("escalaTrib");
            dExe.setIdEns(null);
            dExe.setImportTotal(new Double(0.0));
            dExe.setNifSubjecte("nifSubjecte");
            dExe.setNomSubjecteRaoSocial("nomSubjecteRaoSocial");
            dExe.setPeriodeDeute(EPeriodeDeute.EXECUTIVA);
            dExe.setPisTrib("pisTrib");
            dExe.setPortaTrib("portaTrib");
            dExe.setRefCadastral("refCadastral");
            dExe.setSgTrib("sgTrib");
            dExe.setSituacioDeute(null);
            dExe.setTipusDeute(ETipusDeute.HISTORIC);

            dVol = new Deute();
            dVol.setAdrecaCompletaCom("Això és un prova.");
            dVol.setAdrecaCompletaTrib("Això és un prova.");
            dVol.setCarrerTrib("Això és un prova.");
            dVol.setCasaTrib("Això és un prova.");
            dVol.setClauDeute(null);
            dVol.setClauObjecte("clauObjecte");
            dVol.setDataTerminiFi(new Date());
            dVol.setDataTerminiIni(new Date());
            dVol.setDesEns("descripcioEns");
            dVol.setDesExp("descripcióExp");
            dVol.setDesTribEn("english");
            dVol.setDesTribEs("spanish");
            dVol.setDesTributCa("catalan");
            dVol.setEscalaTrib("escalaTrib");
            dVol.setIdEns(null);
            dVol.setImportTotal(new Double(0.0));
            dVol.setNifSubjecte("nifSubjecte");
            dVol.setNomSubjecteRaoSocial("nomSubjecteRaoSocial");
            dVol.setPeriodeDeute(EPeriodeDeute.VOLUNTARIA);
            dVol.setPisTrib("pisTrib");
            dVol.setPortaTrib("portaTrib");
            dVol.setRefCadastral("refCadastral");
            dVol.setSgTrib("sgTrib");
            dVol.setSituacioDeute(null);
            dVol.setTipusDeute(ETipusDeute.HISTORIC);

            //Carreguem exe
            respostaDeutesExe.add(dExe);
            //Carreguem vol 
            respostaDeutesVol.add(dVol);
        }
//Carreguem tots
respostaDeutesTots.addAll(respostaDeutesExe);
respostaDeutesTots.addAll(respostaDeutesVol);

}

这是上下文代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mockito="http://www.mockito.org/spring/mockito"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.mockito.org/spring/mockito https://bitbucket.org/kubek2k/springockito/raw/tip/springockito/src/main/resources/spring/mockito.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:annotation-config/>
    <context:component-scan base-package="cat.base.gpt.ui" />
    <!-- mock del serveis que podem atacar per solicitar info -->
    <mockito:mock id="serveiSubjecte" class="cat.base.tip.service.ISubjectesService"/>
    <mockito:mock id="serveiTip" class="cat.base.tip.service.ITipService"/>
    <mockito:mock id="serveiGpt" class="cat.base.gpt.domini.service.IGptService"/>
    <mockito:mock id="sessio" class="cat.base.baseframe.session.IBaseSession"/>
    <mockito:mock id="usuari" class="cat.base.baseframe.user.IBaseUser"/>
    <!--  
        <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <property name="basename" value="classpath:cat/base/bfp/ui/applicationResources" />
        </bean>
    -->
    <bean name="consultaDeutes" class="cat.base.gpt.ui.ConsultaDeutesTest"/>

    <bean id="consultaDeutesHandler" class="cat.base.gpt.ui.handler.ConsultaDeutesHandler">
    <property name="serveiSubjecte" ref="serveiSubjecte" />
    <property name="gptServiceBO" ref="serveiGpt"/> 
    <property name="sessio" ref="sessio"/>  
    <property name="usuari" ref="usuari"/>  

</bean>

</beans>

1 个答案:

答案 0 :(得分:2)

正如我在评论中提到的,该消息意味着您希望使用verify进行一些行为,但事实并非如此。

我的测试意图对我来说仍然有点不清楚但是如果你试图测试serveiGpt那么你绝对不应该嘲笑它,而应该嘲笑它的合作者,调用serveiGpt.obtenirDeutes(...)然后验证对协作者的调用。

但是,如果您打算测试处理程序(在评论中提到),那么您似乎缺少在测试中调用处理程序的代码段,它看起来如下所示:

@Test
public void comprovarCercaBuuida(){
    // arrange
    DeuteBackBean deuteBB;

    List<IDeute> respostaDeutesExe = new ArrayList<IDeute>();
    List<IDeute> respostaDeutesVol = new ArrayList<IDeute>();
    List<IDeute> respostaDeutesTots = new ArrayList<IDeute>();

    Mockito.when(serveiGpt.obtenirDeutes(Mockito.eq(CLAU_SUBJECTE_BUIT),Mockito.eq(E_TIPUS_DEUTE_HIS),Mockito.eq(PERIODE_DEUTE_EXE))).thenReturn(respostaDeutesExe);
    Mockito.when(serveiGpt.obtenirDeutes(Mockito.eq(CLAU_SUBJECTE_BUIT),Mockito.eq(E_TIPUS_DEUTE_HIS),Mockito.eq(PERIODE_DEUTE_VOL))).thenReturn(respostaDeutesVol);
    Mockito.when(serveiGpt.obtenirDeutes(Mockito.eq(CLAU_SUBJECTE_BUIT),Mockito.eq(E_TIPUS_DEUTE_HIS),Mockito.eq(PERIODE_DEUTE_TOTS))).thenReturn(respostaDeutesTots);

    // act
    handler.handle(...); // <-- invoking the handler with fictional name

    // assert
    Mockito.verify(serveiGpt,Mockito.atLeastOnce()).obtenirDeutes(Mockito.eq(CLAU_SUBJECTE_BUIT), Mockito.eq(E_TIPUS_DEUTE_HIS), Mockito.eq(PERIODE_DEUTE_EXE));
    //Mockito.verify(serveiPersones,Mockito.atLeastOnce()).cercarPersones(Mockito.eq(PATRO_CERCA_AMB_RESULTATS), Mockito.any(IPager.class));
    //Mockito.verify(serveiPersones,Mockito.atLeastOnce()).cercarPersones(Mockito.eq(PATRO_CERCA_AMB_RESULTATS), Mockito.any(IPager.class));
}

为了让事情更清楚一点,我使用arrange-act-assert pattern来构建测试。

虽然这可能无法完全回答你的问题,但我希望它有所帮助。