2017-10-14 1 views
2

でユニットテストで@Serviceを注入することはできません。アプリケーションクラスでは、scanBasePackagesを指定します。これを別のやり方でやらなくてはなりませんか?ありがとう。は、私はユニットテストでモックしようとしていますが、私はこれまでのところ、NULL値を取得@Serviceを持ってSpringBootプロジェクト

これは、インターフェイスを実装し、私のサービスクラスです:

@Service 
public class DeviceService implements DeviceServiceDao { 

private List<Device> devices; 

@Override 
public List<Device> getDevices(long homeId) { 
    return devices; 
} 

} 

は、これは私のユニットテストです。

public class SmartHomeControllerTest { 

    private RestTemplate restTemplate = new RestTemplate(); 
    private static final String BASE_URL = “..”; 

    @Mock 
    private DeviceService deviceService; 

@Test 
public void getHomeRegisteredDevices() throws Exception { 

    Device activeDevice = new DeviceBuilder() 
      .getActiveDevice(true) 
      .getName("Alexa") 
      .getDeviceId(1) 
      .getHomeId(1) 
      .build(); 
    Device inativeDevice = new DeviceBuilder() 
      .getInactiveDevice(false) 
      .getName("Heater") 
      .getDeviceId(2) 
      .getHomeId(1) 
      .build(); 

    UriComponentsBuilder builder = UriComponentsBuilder 
      .fromUriString(BASE_URL + "/1/devices"); 

    List response = restTemplate.getForObject(builder.toUriString(), List.class); 

    verify(deviceService, times(1)).getDevices(1); 
    verifyNoMoreInteractions(deviceService); 
} 

答えて

0

あなたはあなたがテストの実行中Springコンテキストをロードして使用する場合は春のテストランナーを使用する必要が春のブートランナー

1

を使用してテストを実行する必要があります。
ランナーを指定しないので、デフォルトでテストAPIのランナーが使用されます。おそらく、JUnitまたはTestNGです(使用しているランナーは@Testアノテーションに依存しています)。
また、テストのロジックに従って、あなたは「本当の」 RESTサービス呼び出したい:

List response = restTemplate.getForObject(builder.toUriString(), 
List.class); 

がそれを達成するために、あなたは、Springのコンテキストをロードし、注釈を付けることによって春のブートコンテナをロードする必要があります@SpringBootTestでテストしてください。

Springブートコンテキストを使用する場合、Springコンテキストで依存関係をモックするには、Mockitoの@Mockではなく、Spring Bootの@MockBeanを使用する必要があります。あなたはこのquestionを参照することが2、違いを理解する

注釈@SpringBootTestアノテーションを使用している場合は、TestRestTemplateが自動的に使用可能になり、テストに自動で組み込むことができます。
ただし、これはフォールトトレラントです。それはあなたのテストに応じて、適切でないかもしれません。

だからあなたのコードは次のようになります。、注意点として

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 
public class SmartHomeControllerTest { 

    private static final String BASE_URL = “..”; 

    @Autowired 
    private TestRestTemplate restTemplate; 

    @MockBean 
    private DeviceService deviceService; 

    @Test 
    public void getHomeRegisteredDevices() throws Exception {   
     ... 
    } 

Listとして生タイプを使用しないようが、ジェネリック型を好みます。

+0

で試してみてください、私はこの部分を変更しませんでした。私は注射の問題に焦点を当てました。しかし、あなたはおそらく正しいでしょう。また、OPは検索された 'List'に対してアサーションを作成しません。 – davidxxx

+0

SpringBootTestとMockBeanアノテーションを追加しましたが、nullコンテキストを取得しました: "原因:java.lang.IllegalArgumentException:NULLを持つApplicationContextを読み込めません 'contextLoader'テストクラスに@ContextConfigurationまたは@ContextHierarchyアノテーションを付けることを検討してください" – user1140656

0

私はそれを理解しました。私はMockitoを使用していて、これを使ってテストクラスに注釈を付けました。これは、私が使用しようとしているサービスクラスのモックを得ることができました。

@RunWith(MockitoJUnitRunner.class) 
public class SmartHomeControllerTest {.. 
    @Mock 
    private DeviceService deviceService; 
    } 
0

@InjectMockの代わりに、@Mock

関連する問題