我的应用程序在启动时运行良好,并且在编写控制器的单元测试时遇到了一个奇怪的问题。看起来非常基本和简单,但是在这里停留了很长时间。我尝试了多种变体,包括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.
因此,您正在加载控制器,并希望模拟出控制器将要使用的实际服务。编写这样的测试有两个原因:
控制器具有一些应在“单元测试”级别上检查的代码。为此,您根本不需要弹簧-使用Mockito Runner运行测试,将服务的Mock注入“ controller-class-under-test”,然后检查代码。一般建议/最佳做法是在控制器中保留最少的代码,并且不要在此级别上创建大量代码。
您要检查是否正确定义了控制器(包括所有映射,注释和所有内容)。对于这种测试,spring mvc已经有了您似乎想要重新发明的解决方案:@WebMvcTest
。它执行以下操作:
@Service
/ @Repository
带注释的类的方式自动配置-仅保留控制器。[有许多用于Mock MVC测试的教程,例如,快速使用Google搜索可以发现this one