使用不同服务类别的Spring Boot测试

时间:2019-02-22 16:32:28

标签: spring unit-testing testing kotlin

我有一个很基本的问题,很抱歉,如果以前有人问过这个问题。我担心我可能使用的词语不正确,这是我第一次参加Spring。

我这样声明RestController

@RestController
class TelemetryController {

    @Autowired
    lateinit var service: TelemetryService
    //...
}

在我们的TelemetryService模块中采用main的具体实现:

@Service
class ConcreteTelemetryService : TelemetryService {
   // some production code
}

然后我想在测试期间在控制器中使用一项服务(在我们的test模块内部:

@Service
class TestingTelemetryService : TelemetryService {
   // some test code using local data
}

重要的是,我不想为此使用Mockito,因为测试的实现需要非常不适合Mockito的特定设置。

我的测试被声明为:

@RunWith(SpringRunner::class)
@SpringBootTest
@AutoConfigureMockMvc
class HowDoInjectServiceExampleTest {

    @Autowired
    lateinit var mockMvc: MockMvc
}

在这种情况下,如何将TestingTelemetryService放入控制器?

2 个答案:

答案 0 :(得分:1)

有多种方法可以实现此目的,但我建议使用Spring Profiles。

在默认实现中使用默认配置文件。如果未指定配置文件,将使用此bean。

void pushMagnet(final String apiKey, final String magnetLink, final Context context) {
    final String url = "https://premiumize.me/api/transfer/create?apikey=" + apiKey;
    JSONObject srcMagnet = new JSONObject();
    try {
        srcMagnet.put("src", magnetLink);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    OkHttpClient client = new OkHttpClient().newBuilder()
            .addInterceptor(new GzipRequestInterceptor()).build();
    AndroidNetworking.initialize(context, client);

    AndroidNetworking.post(url)
            .addHeaders("accept", "application/json")
            .addHeaders("Content-Type", "multipart/form-data")
            .addQueryParameter("src", magnetLink)
            .build().getAsJSONObject(new JSONObjectRequestListener() {
        @Override
        public void onResponse(JSONObject response) {
            Log.e("Server response:", response.toString());
        }

        @Override
        public void onError(ANError anError) {
            Log.e("Server error:", anError.toString());
        }
    });

}

将配置文件“测试”添加到测试实现中。

@Profile("default")
@Service
class ConcreteTelemetryService : TelemetryService {
   // some production code
}

现在您可以通过以下方式开始测试

@Profile("test)
@Service
class TestingTelemetryService : TelemetryService {
   // some test code using local data
}

在此处了解有关个人资料的更多信息:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

答案 1 :(得分:0)

如果您的TestingTelemetryServiceHowDoInjectServiceExampleTest处于同一软件包中,那么您可以像下面这样简单地自动装配测试bean

@RunWith(SpringRunner::class)
@SpringBootTest
@AutoConfigureMockMvc
class HowDoInjectServiceExampleTest {

    @Autowired
    lateinit var mockMvc: MockMvc

    @Autowired
    var service: TestingTelemetryService
}

如果不是,那么您应该定义一些TestConfiguration并以编程方式定义具有服务名称的bean,并在测试中使用@Qualifier来使用它来解析要使用的bean(在您的情况下,它是测试bean)