我正在用Mockito为一个项目设置jUnit测试。在被测系统(DrawingService)中调用方法时遇到问题。模拟包括图形和IDrawingRepository。
我不熟悉TDD、单元测试和一般的模拟,所以我可能犯了一些noob错误?任何帮助都将不胜感激。
以下是测试课程:
public class DrawingServiceTest {
private DrawingService drawingService;
private Drawing drawing;
private IDrawingRepository repository;
private String drawingName;
@Before // Executed before each @Test
public void setUp(){
drawingService = new DrawingService();
drawing = mock(Drawing.class);
repository = mock(IDrawingRepository.class);
}
@After // Executed after each @Test
public void tearDown(){
//clean up code
}
@Test
public void getDrawingTest() throws DrawingNotFoundException{
drawingName = "A drawing name that exists";
System.out.println("drawing name is: " + drawingName);
when(repository.findByName(drawingName)).thenReturn(drawing);
System.out.println("calling DrawingService.getDrawing(" + drawingName +")");
drawingService.getDrawing(drawingName); // The test doesn't continue past this line
System.out.println("verifying repository.findByName(" + drawingName +") is called");
verify(repository).findByName(drawingName);
}
以下是正在测试的系统:
@Service ("iDrawingService")
public class DrawingService implements IDrawingService {
@Autowired
private IDrawingRepository repository;
public List<Drawing> getDrawings() {
return (List<Drawing>) repository.findAll();
}
public Drawing getDrawing(String strName) throws DrawingNotFoundException{
Drawing drawing = repository.findByName(strName); //this line throws the NullPointerException
if(drawing == null){
throw new DrawingNotFoundException("No drawing found for name " + strName);
}
return drawing;
}
}
在测试中,你可以简单地用@injectmock
注释你的受试者,并用@Mock
注释你所有的模拟对象,而不是使用@Mock
注释你的受试者。
使用@InjectMocks
你甚至不需要在这个主题上使用getter和setter。在测试中,你从不将存储库
与主题联系起来。
@RunWith(MockitoJUnitRunner.class)
public class DrawingServiceTest {
@InjectMocks private DrawingService drawingService;
@Mock private Drawing drawing;
@Mock private IDrawingRepository repository;
private String drawingName;
在prod中,您的类将在spring中连接IDrawingRepository。您的测试(单元测试)并非如此。你需要手动连接。你的选择是:
我个人会使用构造函数注入,因为它是类正常工作所必需的。你的类也可以很容易地测试。
已更新测试用例,但仍不工作。
我试图测试一个if条件,使用时(),然后返回(),但是当我运行我的测试用例时,它会给我丢失的方法调用,即使我已经嘲笑了实现该方法的类。 这就是我想嘲笑的如果条件 这就是我检查if条件的方式 我已经用@Mock annotation模拟了“request”,但仍然得到下面的异常。 我不确定我做错了什么。有人能帮忙吗?
不需要模拟随机,所以我可以用我的随机器模拟在一行上完成所有的事情?
我有一个JUnit测试套件,有大约800个测试。其中大部分都与Spring连接,大量使用Mockito来模拟/监视行为。我开始遇到内存不足的错误。在分析hprof转储时,我注意到 在测试类完成后,是否有办法清除这些内容?我不想使用Mockito。重置(模拟),因为模拟初始化随每个测试而变化。如果没有,我似乎需要将测试分开以适应泄漏。 从这个链接来看,Mockito团队似乎认识到这些是作为执行后验证