java - 使用 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;
}
解决方案
这将创建一个CalculeMajStockServiceImpl
不注入模拟的间谍实例。
@Spy
CalculeMajStockServiceImpl calculeMajStockServiceImpl = Mockito.spy(CalculeMajStockServiceImpl.class);
你可以试试
@InjectMocks
CalculeMajStockServiceImpl calculeMajStockServiceImpl;
然后显式定义一个 spy inside@Before
方法。
Mockito 不支持将模拟注入间谍。
注意:如果您使用MockitoJUnitRunner
,则没有明确调用MockitoAnnotations.initMocks(this)
推荐阅读
- amazon-rds - 从 PostgreSQL 9.6.11 升级到 10.7 会给出奇怪的 SETVAL() 语句
- php - 正则表达式匹配一个或多个数字或从 I 到 X 的罗马数字在具有特定前缀的单词之后
- matlab - 如果我使用 filtfilt 会发生相位失真吗?
- java - 如何从条形码将 url 编码为 json
- python - 找到一个向量方向,该向量方向与集合中的所有其他向量方向大致相等地偏离例如 5 度
- python - Pandas 数据框 applymap 并行执行
- javascript - CSS 在当前页面上创建边框
- python - 自动硒错误后重新加载python脚本
- android - 定义“视图”位置的准确方法是什么?
- c# - 如何在 Web API 请求的 FromBody ViewModel 中使用具有 EnumMember 属性的枚举?