模拟Java Spring Test - NullPointerException

时间:2017-05-30 20:15:00

标签: java mocking

我是使用模拟测试的新手,我正在尝试在控制器上测试一个方法,但是我得到了NullPointerException。这是我的控制器方法:

    //CREATE MARK
@RequestMapping(value = "/marks", method = RequestMethod.POST)
public void createMark(@RequestBody MarkDTO markDTO) {
    markService.createMark(markDTO);
}

这是我的服务:

public interface MarkService {

Page<MarkDTO> getMarks(Pageable pageable);
MarkDTO getMark(Integer id);

void createMark(MarkDTO markDTO);
void updateMark(Integer id, Mark mark);
void deleteMark(Integer id);

}

这是我的考验:

public class MarkControllerTest {

@Autowired
private WebApplicationContext ctx;

@Mock
private MarkService markService;

private MockMvc mockMvc;

@Before
public void setup(){

}

@Test
public void createMark() throws Exception {


   //doNothing().when(markService.createMark(markDTO));
    mockMvc.perform(post("/marks")
            .contentType(MediaType.APPLICATION_JSON)
            .content("{\n" +
                    "  \"id\": 1,\n" +
                    "  \"id_profesor\": 2,\n" +
                    "  \"valoare\": 10,\n" +
                    "  \"data_notare\": \"2017-05-29\"\n" +
                    "}"));
}

}

如果我取消注释doNothing行,我会收到错误,例如T Stubbed不适用于void。

我不知道如何模拟我的服务,但是我收到了这个错误:

  

java.lang.NullPointerException at   com.fiivirtualcatalog.modules.homework.controllers.MarkControllerTest.createMark(MarkControllerTest.java:66)

我知道哪里出错了?

1 个答案:

答案 0 :(得分:2)

首先,不要忘记声明你想在测试类中测试的控制器,并在你的@Before方法中调用它:

 MockitoAnnotations.initMocks(this);
 this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();

第二个,为了防止模拟markService方法调用的错误你需要使用下面的代码:

doNothing().when(markService).createMark(markDTO);

而不是:

doNothing().when(markService.createMark(markDTO));