6

コンストラクター注入のあるコントローラーがあります

@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 テストの両方に適した方法を教えてください。ありがとう。

4

3 に答える 3