无法在SpringBoot项目的单元测试中注入@Service

时间:2017-10-14 19:17:27

标签: spring-boot spring-boot-test

我有一个@Service,我试图在单元测试中模拟,但到目前为止我得到一个空值。在应用程序类中,我指定了什么是scanBasePackages。我是否必须以不同的方式做到这一点?感谢。

这是我实现接口的服务类:

@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);
}

5 个答案:

答案 0 :(得分:1)

如果要在测试执行期间加载和使用Spring上下文,则必须使用Spring测试运行器 您没有指定任何跑步者,因此它默认使用您的测试API的跑步者。这可能是JUnit或TestNG(使用的跑步者取决于指定的@Test注释) 此外,根据您的测试逻辑,您想要调用&#34;真实&#34; REST服务:

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

要实现它,您应该通过使用@SpringBootTest注释测试来加载Spring上下文并加载Spring Boot容器。

如果使用Spring Boot上下文来模拟Spring上下文中的依赖项,则不能使用Mockito中的@Mock,而应使用Spring Boot中的@MockBean。 要了解这两者之间的区别,您可以参考此question

请注意,如果您使用的是@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,但要使用泛型类型。

答案 1 :(得分:0)

您应该使用spring boot runner

运行测试

答案 2 :(得分:0)

我想通了,我正在使用Mockito并用它来注释我的测试类。这让我可以模拟我正在尝试使用的服务类。

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

答案 3 :(得分:0)

尝试使用@InjectMock而不是@Mock

答案 4 :(得分:0)

@RunWith(SpringJUnit4ClassRunner.class)  
@SpringBootTest(classes = NotificationApplication.class)  
public class EmailClientImplTest {  
...  
}  

并在
中添加所需的属性/配置 / src / 测试 /resources/application.yml

祝你好运!