首页 > 解决方案 > 使用 Mockito,但正在调用真正的方法

问题描述

我正在我的 Spring Boot 项目中进行单元测试,并且正在使用 mockito 来模拟实例。CalculeMajStockServiceImpl 是我要测试的类,getEtatTranche 是我要测试的方法。
这是我的测试类。这里的问题是调用了真正的getDateCouplageParCycleEtParTrancheEtParLibelle方法。

@RunWith(MockitoJUnitRunner.class)
class CalculeMajStockServiceImplTest {
     
    @Mock
    private ServiceBddProxy serviceBddProxy;

    @Mock
    private ServiceDataExcelProxy serviceDataExcelProxy;

    @Mock
    private ServiceAccessDonneesProxy serviceAccessDonneesProxy;

    @Mock
    private ParseFichierC3poServiceImpl parseFichierC3poServiceImpl;

    @Mock
    private ParseFichierRealiseRteServiceImpl parseFichierRealiseRteServiceImpl;

    @Mock
    private ParseFichierHebdoServiceImpl parseFichierHebdoServiceImpl;

    @Spy
    CalculeMajStockServiceImpl calculeMajStockServiceImpl = Mockito.spy(CalculeMajStockServiceImpl.class);

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

    @Test
    public void getEtatTranche() {
        Date dateExtrapolation = new Date(2020, 05, 06);
        Date dateDeCouplage = new Date(2020, 04, 06);
        Date dateCourante = new Date(2020, 03, 20);
        Date dateCoouplageLibellePrecedent = new Date(2020, 03, 19);
        Long idLibellePrecedent = 1L;
        String trancheCode = "BELV1";
        int numCycle = 23;

        LibelleDto libelle = new LibelleDto();
        libelle.setDateCourante(dateCourante);
        
        LibelleDto libellePrecedent = new LibelleDto();
        libellePrecedent.setDateCourante(dateCourante);
        // CAS OU dateCourante>=dateCouplageLibellePrecedent et
        // dateExtrapolation>dateCouplage
         doReturn(dateCoouplageLibellePrecedent).when(calculeMajStockServiceImpl)
                .getDateCouplageParCycleEtParTrancheEtParLibelle(Mockito.anyLong(), Mockito.anyString(),
                        Mockito.anyInt());
        Integer calculated = this.calculeMajStockServiceImpl.getEtatTranche(dateDeCouplage,
                trancheCode, numCycle, libellePrecedent, new Date());
         verify(calculeMajStockServiceImpl).getDateCouplageParCycleEtParTrancheEtParLibelle(Mockito.anyLong(), Mockito.anyString(), Mockito.anyInt());
    //  verify(calculeMajStockServiceImpl).findLibelleById(Mockito.anyLong());
        Integer expected = 2;
        assertEquals(expected, calculated);}
}

这就是我要测试的方法

@Override
    public int getEtatTranche(Date dateCouplage, String trancheCode, int numCycle,
            LibelleDto libellePrecedent, Date dateCourante) {
        int etatTranche = 0;

        if (dateCourante != null && dateCouplage != null) {
            if (dateCouplage.compareTo(dateCourante) > 0) {
                Date dateCouplageLibellePrecedent = this.getDateCouplageParCycleEtParTrancheEtParLibelle(
                        libellePrecedent.getId(), trancheCode, numCycle);
                if (dateCouplageLibellePrecedent != null && dateCourante != null
                        && dateCouplageLibellePrecedent.compareTo(libellePrecedent.getDateCourante()) <= 0) {
                    etatTranche = 2;
                } else {
                    etatTranche = 3;
                }
            }

            else {
                etatTranche = 1;
            }
        }
        return etatTranche;
    }

标签: javaunit-testingjunitmockito

解决方案


这将创建一个CalculeMajStockServiceImpl 注入模拟的间谍实例。

@Spy
CalculeMajStockServiceImpl calculeMajStockServiceImpl = Mockito.spy(CalculeMajStockServiceImpl.class);

你可以试试

@InjectMocks 
CalculeMajStockServiceImpl calculeMajStockServiceImpl;

然后显式定义一个 spy inside@Before方法。

Mockito 不支持将模拟注入间谍。

注意:如果您使用MockitoJUnitRunner,则没有明确调用MockitoAnnotations.initMocks(this)


推荐阅读