当前位置: 首页 > 知识库问答 >
问题:

Springboot测试问题:Mockito返回空对象

云京
2023-03-14

我正在尝试构建一个使用gradle作为构建工具和openjdk-11的原型。这个原型将在springboot框架上构建一个rest-api。

我的模块与rest api调用配合良好,并返回了预期结果。然而,当我现在试图为RESTAPI编写测试时,测试失败了,因为Mockito返回了空对象。如果您能了解我应该如何为这个rest api编写测试或如何修复它,我将不胜感激。

我的控制器:

@RestController
public class GreetingController {

private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();

@Autowired
GreetingService service;

@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
    return service.getGreetings(0L, String.format(template, name));
}
}

服务:

@Service
public class GreetingService {

public Greeting getGreetings() {
    return new Greeting(1L, "Hello World");
}

public Greeting getGreetings(Long id, String name) {
    return new Greeting(id, name);
}
}

模型:

@Builder
@Data
@RequiredArgsConstructor
@JsonDeserialize(builder = Greeting.class)
public class Greeting {
    @NonNull
    private Long id;

    @NonNull
    private String content;

}

主要类别:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我签署了以下文件:

gradle bootrun

然后从浏览器中尝试:

http://localhost:8080/greeting 

那回来了:

{"id":0,"content":"Hello, World!"}

再次尝试:

http://localhost:8080/greeting?name=Patty

结果是:

{"id":0,"content":"Hello, Patty!"}

现在,我正在尝试编写测试,以通过编程验证类似于上述调用的api调用。所以我试着:

@RunWith(MockitoJUnitRunner.class)
public class GreetingControllerTest {

    private MockMvc mockMvc;

    @Mock
    private GreetingService service;

    @InjectMocks
    private GreetingController controller


    @Test
    public void testGreeting() throws Exception {

        Greeting  greeting  = new Greeting(0L,"Patty!");
        String expectedResponse  = "{\"id\":0,\"content\":\"Hello, Patty!\"}";


        //JacksonTester.initFields(this, new ObjectMapper());
        mockMvc = MockMvcBuilders.standaloneSetup(controller)
                .build();
        Mockito.when(service.getGreetings(0L,"Patty")).thenReturn(greeting);


        MockHttpServletResponse response = mockMvc
                .perform(get("/greeting?name=Patty")
                        .contentType(MediaType.ALL))
                .andReturn()
                .getResponse();


        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
        assertThat(response.getContentAsString()).isEqualTo(expectedResponse)


    }




}

错误msg是:

org.junit.ComparisonFailure: 
Expected :"{"id":0,"content":"Hello, Patty!"}"
Actual   :""

从此行失败:

assertThat(response.getContentAsString()).isEqualTo(expectedResponse)

提前谢谢。

共有1个答案

刘意
2023-03-14

这有助于我理解:Mockito-thenReturn总是返回null对象

我换了Mockito。当部分到:

Mockito.when(service.getGreetings(Mockito.anyLong(),Mockito.anyString())).thenReturn(greeting);

而且奏效了

 类似资料:
  • 我试着去模拟课堂,但我总是得到一个NPE。我见过当stubing方法时发布mockito-nullPointerException。在这篇文章中,他们这样解释: 我几乎可以肯定这也适用于我的问题。但我找不到解决办法。我已经试了10个小时了。 我还读了一些关于@autowired和@before的东西,显然@autowired是在@before之前创建的,这也可以解释我的NPE。 在@test vo

  • 我试图实现Mockito来测试一个特定的方法,但是。然后返回(…)似乎总是返回空对象,而不是我想要的: 切: Spring配置: 莫基托试验方法: 系统输出: 这里发生的事情是,当我运行测试时,在上面标有//PROBLEM的CUT中的行上,serviceSolutions对象为空。我的愿望是让那个对象从我的测试方法中填充我的“无效服务响应”对象。从我的System.out.println的输出来看

  • 问题内容: 我的JSON有问题。它可以在PHP 5.3中正确返回(因此我不能使用json_last_error()),并且在我将字符串显式复制到json_decode(json_decode(’{…}’)中时成功返回。结果作为变量,我正在使用php 5.2,这是我需要的。 输出来自PHPUnit中的JSON日志记录: 编辑:这些是我一直在探索的路径-也许您是一个更好的探索者。.三种可能的路径可以帮

  • 我试图模拟一个对象,该对象返回一个带有Mockito的Java可选对象: 当被调用,它返回。 我希望方法返回 返回的任何原因? 方法如下: 以下是Junit:

  • 我正在尝试使用{mount}方法对我的React类组件进行单元测试。当我尝试访问class变量(使用这个关键字)时,运行测试会给出一个未定义的错误。下面的示例,其中调用后,此.DataSource的计算结果为未定义

  • 本文向大家介绍关于axios返回空对象的问题解决,包括了关于axios返回空对象的问题解决的使用技巧和注意事项,需要的朋友参考一下 在本文开始之前,关于axios基本入门用法可以参考这篇文章,下面来看看本文的详细内容吧。 问题描述: 使用 axios 请求数据的时候,已经请求成功,返回的参数也正确。但打印出来的时候就变成了空对象。 分析原因: 返回的参数都是正确的,只是打印的时候有问题,所以是打印