我有一个@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);
}
答案 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
祝你好运!