- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在这里,我使用 WebMvcTest
、 MockMvc
测试我的端点,并使用 @MockBean
模拟服务。如果不使用 standaloneSetup
方法,下面的代码可以正常运行。
public class MessageControllerTest {
@Nested
@WebMvcTest
class TestUsingMockServer {
@MockBean
MessageServiceImpl messageService;
@Autowired
MockMvc mockMvc;
@Test
public void test_to_return_id_with_message_json() throws Exception {
when(messageService.findById(anyLong())).thenAnswer(invocation -> new Message("Hello World", (Long) invocation.getArguments()[0], LocalDateTime.now()));
mockMvc.perform(get("/resources/messages/{id}", 3)
.contextPath("/resources")
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(result -> {
result.toString().contains("3");
result.toString().contains("Hello World");
});
}
@Test
public void test_to_get_the_name_passed() throws Exception {
when(messageService.getMessageByIdName(anyLong(), anyString())).thenAnswer(invocation -> new Message("Hello " + invocation.getArguments()[1],
(Long) invocation.getArguments()[0], LocalDateTime.now()));
mockMvc.perform(get("/resources/messages/{id}", 3)
.queryParam("name", "kaustubh")
.contextPath("/resources")
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(result -> {
result.toString().contains("3");
result.toString().contains("kaustubh");
});
}
}
}
为了避免重复,当我添加 standaloneSetup
方法并运行测试时,我收到错误,提示 MessageServiceImpl bean 未初始化(因为 NullPointerException
)
public class MessageControllerTest {
@Nested
@WebMvcTest
class TestUsingMockServer {
@MockBean
MessageServiceImpl messageService;
@Autowired
MockMvc mockMvc;
@BeforeEach
public void setUp(){
mockMvc = standaloneSetup(new MessageController())
.defaultRequest(get("/")
.contextPath("/resources")
.accept(MediaType.APPLICATION_JSON)
).build();
}
@Test
public void test_to_return_id_with_message_json() throws Exception {
when(messageService.findById(anyLong())).thenAnswer(invocation -> new Message("Hello World", (Long) invocation.getArguments()[0], LocalDateTime.now()));
mockMvc.perform(get("/resources/messages/{id}",3))
.andDo(print())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(result -> {
result.toString().contains("3");
result.toString().contains("Hello World");
});
}
}
}
报错如下
第 17 行,在错误中,调用 MessageServiceImpl
@RestController
@RequestMapping("/messages")
public class MessageController {
@Autowired
MessageServiceImpl messageService;
@GetMapping(path = "/{id}")
public Message getMessageById(@PathVariable Long id) {
return messageService.findById(id); // LINE 17
}
@GetMapping(path = "/{id}", params = "name")
public Message getMessageByIdName(@PathVariable Long id, @RequestParam(value = "name", defaultValue = "ST") String name) {
return messageService.getMessageByIdName(id, name);
}
}
发生这种情况是因为 MockMvc
构建器是在创建服务 bean 之前设置的吗?
最佳答案
关于测试设置,您必须了解一些事情。
在第一个示例中:
@WebMvcTest
class TestUsingMockServer {
@MockBean
MessageServiceImpl messageService;
@Autowired
MockMvc mockMvc;
这里测试上下文是由@WebMvcTest启动的,因此MockMvc可以 Autowiring 。 @WebMvcTest 还将查看 @Mockbean 以查看需要模拟的内容。
在我们的第二个示例中:
@WebMvcTest
class TestUsingMockServer {
@MockBean
MessageServiceImpl messageService;
@Autowired
MockMvc mockMvc;
@BeforeEach
public void setUp(){
mockMvc = standaloneSetup(new MessageController())
.defaultRequest(get("/")
.contextPath("/resources")
.accept(MediaType.APPLICATION_JSON)
).build();
}
在这里,您将使用另一个实例覆盖您的 @Autowired mockMvc 对象。在这里您将设置上下文,
mockMvc = standaloneSetup(new MessageController())
此设置将跳过任何 Autowiring ,因此在您的 MessageController 类中,
@Autowired
MessageServiceImpl messageService;
这将被跳过。并且将为空。
所以寻求解决方案。一个简单的解决方法是通过构造函数进行 Autowiring :
@Autowired
public MessageController(MessageServiceImpl messageService) {
this.messageService = messageService;
}
现在您可以在测试类中添加模拟:
mockMvc = standaloneSetup(new MessageController(messageService))
这将解决您的问题。
我想给出的其他建议是,您不必太担心重复测试。一旦加载了上下文,它们就会运行得非常快。
关于java - 使用 MockMvcstandaloneSetup 时 MockBean 未初始化服务 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61224791/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!