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

Spring mockito-JUnit控制器测试-模拟一个服务

须曜文
2023-03-14

>

  • 解析某些文件的服务

    管理文件系统的ServiceB

    我想测试ControllerClass,特别是:

  • 共有1个答案

    柯星华
    2023-03-14

    从一个简单的spring-web应用程序开始,进行以下测试:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class MyControllerTest {
    
        @Autowired
        private MockMvc mvc;
    
        @Test
        public void testGreeting() throws Exception {
            mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                    .andExpect(status().isOk())
                    .andExpect(content().string(equalTo("A response: I am real ServiceA!, B response: I am real ServiceB!")));
        }
    }
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class MyControllerMockBeanTest {
    
        @MockBean
        private ServiceB mockB;
    
        @Before
        public void setup() {
           Mockito.when(mockB.greeting()).thenReturn("I am mock Service B!");
        }
        @Autowired
        private MockMvc mvc;
    
        @Test
        public void testGreetingMock() throws Exception {
           mvc.perform(MockMvcRequestBuilders.get("/")
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("A response: I am real ServiceA!, B response: I am mock Service B!")));
        }
    }
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    // activate "test" profile
    @ActiveProfiles("test")
    // set custom config classes (don't forget Application)
    @ContextConfiguration(classes = {TestConfig.class, Application.class})
    public class MyControllerTest {
        // define configuration for "test" profile (inline possible)
        @Profile("test")
        @Configuration
        static class TestConfig {
    
            @Bean
            // !
            @Primary
            // I had an (auto configuration) exception/clash, 
            // when using *same bean name*, so *not* 'serviceB()', plz.
            public ServiceB mockB() {
                // prepare...
                ServiceB mockService = Mockito.mock(ServiceB.class);
                Mockito.when(mockService.greeting()).thenReturn("I am Mock Service B!");
                // and return your mock object!
                return mockService;
            }
        }
        @Autowired
        private MockMvc mvc;
    
        @Test
        public void testGreetingMock() throws Exception {
            mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                    .andExpect(status().isOk())
                    .andExpect(content().string(equalTo("A response: I am real ServiceA!, B response: I am Mock Service B!")));
        }
    }
    

    GitHub的完整样本。

    而且我十分肯定,解决办法的清单并不完整。

     类似资料:
    • 问题内容: 我有一个ParseService,我想对其进行模拟以测试使用它的所有控制器,我一直在阅读有关茉莉花间谍的信息,但对我来说仍然不清楚。谁能给我一个关于如何模拟定制服务并在Controller测试中使用它的示例吗? 现在,我有一个使用服务插入书的控制器: 服务是这样的: 到目前为止,我的测试如下所示: 现在测试失败: 我做错了什么? 问题答案: 我做错的是没有在beforeEach中将模拟

    • 问题内容: 我有以下情况: controller.js controllerSpec.js 错误: 我也尝试过类似的方法,但没有成功: 我该如何解决?有什么建议? 问题答案: 有两种方法(或肯定有更多方法)。 想象一下这种服务(无论它是工厂都没关系): 使用此控制器: 一种方法是使用要使用的方法创建对象并对其进行监视: 然后,将其作为dep传递给控制器​​。无需注入服务。那可行。 另一种方法是模拟

    • 本节介绍与JUnit Framework相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 JUnit Mock Test I 问题1 - 以下哪项描述正确测试? A - 测试是检查应用程序功能的过程,是否按照要求运行。 B - 测试是单个实体(类或方法)的测试。 C - 以上两者。 D - 以上都

    • 我试图在Spring boot 2中编写一个测试类,其中: 我想测试一个控制器 我想嘲笑一个仓库 我想按原样注入一个服务(即不嘲笑它) 该类看起来像: 的(唯一)实现是用注释的,并允许通过其构造函数注入仓库: 运行测试时,我得到了一个,大致上说是“没有可用”。 我怀疑我可能需要一个特定的测试配置来获得服务,但是我被可用的在线文献弄糊涂了。 有指针吗?

    • 我正在寻找一种方法来模拟Controller中使用的服务bean,这样我就可以使用MockMVC只测试Controller。但是我找不到一个简单的方法来用Spock Mock代替real bean。一切都使用spring-boot 1.3.2版本。更多细节如下: 我有一个以下控制器类 和集成Spock测试: 我需要一种方法来替换这个autowired bean,用一个mock/stub这样我就可以

    • 我有一个Spring 3.2 MVC应用程序,正在使用Spring MVC测试框架测试控制器动作的GET和POST请求。我使用Mockito来模拟服务,但我发现模拟被忽略了,我的实际服务层被使用了(因此,数据库被击中)。 控制器测试中的代码: 你会注意到我有两个上下文配置文件;这是一种黑客行为,因为如果我无法阻止控制器测试命中实际的服务层,那么该服务层的存储库也可能指向测试数据库。我再也不能忍受这