gpt4 book ai didi

java - 使用 Mockito 实现 Junits

转载 作者:行者123 更新时间:2023-12-02 04:23:43 25 4
gpt4 key购买 nike

我正在尝试为 Web 服务编写 Junits。Web 服务是通过 3 层实现的。

Webservice -> 实现层 -> Dao 层。

实现层实际上将 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 层,我没有发布。

测试类:

@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));
}

但它并没有 mock 该值,如

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

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

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

最佳答案

a) 你有

@InjectMocks
private static SolvabiliteWSImpl mockedSolvabiliteWSImpl;

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

b) 你不需要

MockitoAnnotations.initMocks(this);

当您使用时

@RunWith(MockitoJUnitRunner.class)

仅其中之一。正如 @crea1 所写 - @Before 的顺序尚未确定,因此最好简单地删除 MockitoAnnotations.initMocks(this);

关于java - 使用 Mockito 实现 Junits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32451139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com