春季测试:如何通过'模型到控制器后方法

时间:2017-11-14 14:50:01

标签: java spring spring-mvc testing integration-testing

我正在Spring Boot工作,我正在尝试为控制器编写一个集成测试,如下所示:

public String pagerequestSubmit(@ModelAttribute Pagerequest pagerequest, Model model) {
...
 }

现在我尝试为此控制器编写集成测试,如下所示:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes=PageAnalyzerInSpringApplication.class)
public class PagerequestControllerIntegrationTest {

@Autowired
PagerequestController pagerequestController;

@Test
public void testHappyPath() {


    Pagerequest mockPageRequest = new Pagerequest();
    mockPageRequest.setUrl("https://www.somedomain.com/");
    ....

    String outcome = pagerequestController.pagerequestSubmit(mockPageRequest);

    assertThat(outcome, is(equalTo("result")));

}

我在做模拟网页请求时没有任何问题。并将其传递给post方法,所以我做到了这一点,但上面的测试不起作用,因为我得到了:

" PagerequestController类型中的方法pagerequestSubmit(Pagerequest,Model)不适用于参数(Pagerequest)"

这是有道理的,因为我没有传递Model类型的任何参数 而且我完全坚持如何做到这一点。

我试图实例化一个不起作用的模型,创建一个假模型,它也没有工作,并传入一个null变量的Model变量,至少得到测试运行,但在控制器中使用模型时抛出空指针异常。

有关如何解决此问题的任何想法?

提前致谢!

1 个答案:

答案 0 :(得分:0)

你的pagerequestSubmit(@ModelAttribute Pagerequest pagerequest, Model model)接受两个参数,一个是pagerequest而另一个是模型,但是在你的测试中你只传递了pagerequest。你也需要传递模型对象。这只是测试类中的错误方法签名。 创建模型对象的模拟并将其粘贴到代码中

 @Mock
    private Model model;

 String outcome = pagerequestController.pagerequestSubmit(mockPageRequest,model);
 assertThat(outcome, is(equalTo("result")));