コンストラクター注入のあるコントローラーがあります
@RestController
@RequestMapping("/user")
public class MainController {
private final UserMapper userMapper; // autowired by constructor below
public MainController(UserMapper userMapper) {
this.userMapper = userMapper;
}
@RequestMapping("/getChannels")
public String index() {
LoginUser user = userMapper.getUserByName("admin");
return "Channels: " + user.getChannels();
}
}
それはうまく機能している単純なクラスです。ただし、以下のクラスで JUnit テストを実行しようとすると、エラーが発生しました。
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class MainControllerTest {
private MockMvc mvc;
private final UserMapper userMapper;
public MainControllerTest(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new MainController(userMapper)).build();
}
......
エラーは次のとおりです。
java.lang.Exception: Test class should have exactly one public zero-argument constructor
userMapper に引数なしのコンストラクターを挿入するにはどうすればよいかという上記のエラー メッセージに混乱しました。MainController の userMapper に @Autowired を追加できることはわかっていますが、フィールド インジェクションは推奨されません。コンストラクター インジェクションと MockMvc テストの両方に適した方法を教えてください。ありがとう。