com.test.controller.TestController中的字段testService需要'com.test.service.TestService'类型的Bean,找不到

问题描述 投票:0回答:1

我的应用程序在启动时运行良好,并且在编写控制器的单元测试时遇到了一个奇怪的问题。看起来非常基本和简单,但是在这里停留了很长时间。我尝试了多种变体,包括Mockito.Annotations,如Baeldung中所述,使用Bean名称添加了Qualifier,但仍然出现基本错误。请协助解决此问题。

控制器类:

@Controller
@EnableAutoConfiguration
@Component
public class UserController {
    private static final Logger LOG = LoggerFactory.getLogger(UserController .class);

    @Autowired
    @Qualifier("userService")
    private userService userService;
}

服务接口:

public interface UserService {
    public User getUserById(Integer userId);
}

服务实施

@Service
public class UserServiceImpl implements UserService {
    private static final Logger LOG = LoggerFactory.getLogger(UserServiceImpl.class);
     @Autowired
    RecordService recordService;
    @Autowired
    UserDao userDao;
}

测试类别

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { UserController.class, UserService.class })
public class UserControllerTest {

    private MockMvc mockMvc;

    @InjectMocks
    UserController userController;

    @Mock
    UserService userService;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this); // tried this to see if it helps
        mockMvc = MockMvcBuilders.standaloneSetup(testController).build();
    }

    @Test
    public void testWelcome() throws Exception {
        // Mocking Controller
        testController = mock(TestController.class);
        this.mockMvc.perform(get("/")).andExpect(status().isOk()) .andExpect(view().name("Welcome to Test-Service."));
    }
}

我的应用程序在启动时运行良好,并且在编写控制器的单元测试时遇到了一个奇怪的问题。看起来非常基本和简单,但是在这里停留了很长时间。我尝试了多种变体,包括Mockito.Annotations,如Baeldung中所述,使用Bean名称添加了Qualifier,但仍然出现基本错误。请协助解决此问题。

***************************
APPLICATION FAILED TO START
    ***************************   
Field testService in com.test.controller.UserController required a bean of type 'com.service.UserService' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)
    - @org.springframework.beans.factory.annotation.Qualifier(value=testService)
Action:
Consider defining a bean of type 'com.service.UserService' in your configuration.
spring spring-boot mockmvc
1个回答
0
投票

因此,您正在加载控制器,并希望模拟出控制器将要使用的实际服务。编写这样的测试有两个原因:

  1. 控制器具有一些应在“单元测试”级别上检查的代码。为此,您根本不需要弹簧-使用Mockito Runner运行测试,将服务的Mock注入“ controller-class-under-test”,然后检查代码。一般建议/最佳做法是在控制器中保留最少的代码,并且不要在此级别上创建大量代码。

  2. 您要检查是否正确定义了控制器(包括所有映射,注释和所有内容)。对于这种测试,spring mvc已经有了您似乎想要重新发明的解决方案:@WebMvcTest。它执行以下操作:

    • 在内存中创建一个“ mini mvc”(在下面调度)-您可以与测试中的特殊MockMVC类进行交互,定义期望并“调用”请求。
    • 使用此模拟引擎中映射的控制器运行应用程序的一部分
    • 以不会加载@Service / @Repository带注释的类的方式自动配置-仅保留控制器。
    • 该服务将被模拟,并且可以在测试中指定对其的期望。

[有许多用于Mock MVC测试的教程,例如,快速使用Google搜索可以发现this one

© www.soinside.com 2019 - 2024. All rights reserved.