当前位置: 首页 > 知识库问答 >
问题:

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

贡斌
2023-03-14

我有一个@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);
}

共有3个答案

芮叶秋
2023-03-14

我弄明白了,我正在使用Mockito并用它来注释我的测试类。这使我能够模拟我试图使用的服务类。

@RunWith(MockitoJUnitRunner.class)
 public class SmartHomeControllerTest {..
     @Mock
     private DeviceService deviceService;
  }
居星阑
2023-03-14
@RunWith(SpringJUnit4ClassRunner.class)  
@SpringBootTest(classes = NotificationApplication.class)  
public class EmailClientImplTest {  
...  
}  

还可以在
/src/test/resources/application中添加所需的属性/配置。yml

祝你好运

祁正浩
2023-03-14

如果要在测试执行期间加载和使用Spring上下文,必须使用Spring测试运行程序
您没有指定任何运行程序,因此它默认使用测试API的运行程序。这里可能是JUnit或TestNG(运行程序的使用取决于指定的@Test注释)
此外,根据测试的逻辑,您希望调用“真正的”REST服务:

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

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

如果使用Spring Boot上下文,要在Spring上下文中模拟依赖关系,不能使用Mockito提供的@mock,而是Spring Boot提供的@MockBean<为了理解两者之间的区别,你可以参考这个问题。

请注意,如果您使用的是@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 {        
       ...
    }

作为补充说明,避免使用原始类型作为列表,而应使用泛型类型。

 类似资料:
  • 问题内容: 我正在尝试为我的项目编写一个单元测试,但是它不允许我使用配置管理器。现在我的项目像 ASP.Net应用程序(所有aspx页) ProjectCore(所有C#文件-模型) ProjectTest(所有测试) 在我的ProjectCore中,我可以从System.Configuration访问ConfigurationManager对象,并将信息传递到项目中。但是,当我运行涉及Confi

  • 当我构建我的解决方案(包括一个单元测试项目)时,我收到了这个错误。 此项目引用了此计算机上缺少的NuGet包。使用NuGet Package Restore下载它们。有关详细信息,请参见http://go.microsoft.com/fwlink/?LinkID=322105.缺少的文件是..\packages\MSTest.TestAdapter.1.1.11\build\net45\MSTes

  • 我有一个处理jwt创建的类: 并从resources文件夹中的属性文件中获取jwtSecret和jwtExpirationInMs。 我的单元测试如下所示:

  • 我在pycharm中调试单元测试时遇到问题。我可以使用我的配置很好地运行它们,但当我运行调试器时,会得到以下错误输出: 我的目录结构是: 我的unittest配置是: 看起来像: 做什么?如何确保在调试期间找到它?问题实际上与正在查找的文件/目录无关吗?

  • 我有一个非常简单的rest控制器: 记录器依赖项通过以下配置注入:

  • 我正在尝试为一个现有的应用程序编写单元测试用例,该应用程序有多个模块,每个模块中都有主类。有多个类具有\@SpringBootApplication。我写了一个简单的测试用例,它失败了,错误如下。我如何继续我的测试用例中的一个。 java.lang.IllegalStateException:在文件[C:\My Data\Workspace\Services2\MicroServices\Repo