1

複数の Spring Bean 依存関係 (自動配線サービス) を持つ Spring コントローラーがあります。各サービスには、Spring Bean の依存関係もほとんどありません (autowired daos)。たとえば、コントローラーのログイン方法は次のとおりです。

@Controller
@RequestMapping("/")
public class ClientAccessController extends BaseController {

    @Autowired
    IFileService fileService;

    @Autowired
    MidTierService midTierService;

    /**
     * Used to handle client login requests
     * Works as a proxy to MID tier server
     *
     * @param request LoginRequest(userLogin, userPassword, compId, installGuid)
     * @return LoginResponse (token)
     * @throws Exception
     */
    @RequestMapping(method = RequestMethod.POST, value = "/login", headers = "Content-   type=application/json")
    public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request) throws Exception {

        log.info("LOGIN REQUEST [ " + request.toString() + " ]");

        String token = midTierService.authenticateNativeClient(request.getLogin(), request.getPassword(), request.getGuId(),
                request.getCompid().toString());
        LoginResponse response = new LoginResponse(token);

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);

        ResponseEntity<LoginResponse> responseEntity = new ResponseEntity<>(response, HttpStatus.OK);

        log.info("LOGIN RESPONSE [ " + response.toString());

        return responseEntity;
    }

controller のみの JUnit テストを作成しようとしていますClienAccessController。しかしClientAccessController、テストクラスで自動配線すると、Spring はすべてのコントローラーの依存関係とすべてのネストされたもの (daos など) の Bean を作成しようとしますが、本当に em は必要ありませんMidTierService。では、ネストされた Bean の初期化を除外し、テスト クラスで必要なものだけを使用するにはどうすればよいでしょうか?

4

2 に答える 2

1

@AutowiredSpring では、メンバーへの複数の方法が許可されます。(テスト容易性の観点から)私にとって好ましいアプローチは@Autowired、コンストラクターに対するものです。したがってClientAccessController、次のようなコンストラクターを作成します。

@Autowired
public ClientAccessController(final IFileService fileService, final MidTierService midTierService) {
    this.fileService = fileService;
    this.midTierService = midTierService;
}

@Qualifierオートワイヤリングが ( orを使用するという点で) もう少し複雑な場合は、@Valueパラメーター アノテーションを使用してさらに多くのことを実行できます。

@Autowired
public ClientAccessController(@Qualifier("myFileService") final IFileService fileService,
       @Qualifier("myMidTierService") final MidTierService midTierService) {
    this.fileService = fileService;
    this.midTierService = midTierService;
}

そうすれば、テスト用のモック オブジェクトまたはスタブを使用してこのクラスを簡単に設定できます。

@Test
public void testClientAccessController() {
    final IFileService mockFileService = Mockito.mock(IFileService.class);
    final MidTierService mockMidTierService = Mockito.mock(MidTierService.class);
    final ClientAccessController controller = new ClientAccessController(mockFileService, mockMidTierService);
    //test it
}
于 2012-10-30T13:09:21.650 に答える