我正在尝试为网络服务编写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。但函数进一步进入这个方法,然后给我空指针异常,这意味着它不是嘲笑?请建议一种可行的测试方法。
答案 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);
}