web-dev-qa-db-ja.com

テスト中の依存関係の不満

私は春のブート2.0.0 M2アプリケーションを実行しています。

コンストラクターでautowiredを使用します

@RequestMapping(value = "/rest")
@RestController
public class AddressRestController extends BaseController{

    private final AddressService AddressService;

    @Autowired
    public AddressRestController(final AddressService AddressService) {
        this.AddressService = AddressService;
    }
    ...
}

@Service
public class AddressServiceImpl extends BaseService implements AddressService {

    @Autowired
    public AddressServiceImpl(final AddressRepository AddressRepository) {
        this.AddressRepository = AddressRepository;
    }

    private final AddressRepository AddressRepository;
    ...
}


public interface AddressRepository extends JpaRepository<Address, Integer>, AddressRepositoryCustom {

}

@Repository
public class AddressRepositoryImpl extends SimpleJpaRepository implements AddressRepositoryCustom {
    @PersistenceContext
    private EntityManager em;

    @Autowired
    public AddressRepositoryImpl(EntityManager em) {
        super(Address.class, em);
    }
    ...
}

基本的なテストを実行しようとすると

@RunWith(SpringJUnit4ClassRunner.class)
public class AddressServiceTest {

    @Autowired
    private AddressService service;

    @MockBean
    private AddressRepository restTemplate; 

    @Test
    public void getAddress(){

        MockitoAnnotations.initMocks(this);

        Pageable page = PageRequest.of(0, 20);

        Page<Address> pageAdr = mock(Page.class);

        given(this.restTemplate.findAll(page)).willReturn(pageAdr);

        Page<AddressDto> pageDto = service.getAddress(page);

    }
}

私はこのエラーを受け取ります

org.springframework.beans.factory.UnsatisfiedDependencyException: 'com.sonos.arcor.service.AddressServiceTest'という名前のBeanの作成中にエラーが発生しました:フィールド 'service'で表現された依存関係が満たされていません;ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExceptionです:タイプ '' com.sonos.arcor.service.AddressService 'の適格なBeanがありません:autowire候補として適格なBeanが少なくとも1つ必要です。依存関係アノテーション:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

このエラーが発生する理由がわかりません。

5
robert trudel

Springがアプリケーションコンテキストを初期化するように、テストにSpringBootTestの注釈を付ける必要があります

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications

_@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class AddressServiceTest {
// the remaining test
}
_

また、MockitoAnnotations.initMocks(this);は必要ありません。

Springはモック処理を処理します

フィールドで[@MockBeanが使用される]と、作成されたモックのインスタンスも注入されます。モックビーンは各テスト方法の後に自動的にリセットされます

モックビーンとスパイビーン を参照してください

12
Mathias Dpunkt