如何在Spock测试框架中模拟服务类注入?

时间:2018-10-19 10:23:59

标签: java mocking spock

我有一个Java服务,其中Guice注入的东西很少。

public class RecoveryServiceImpl implements RecoveryService {
    @Inject
    public RecoveryServiceImpl(SessionInstanceCache sessionInstanceCache, AttendeeCache attendeeCache, MessagingStreamConfiguration messagingConfig) {
        this.sessionInstanceCache = sessionInstanceCache;
        this.attendeeCache = attendeeCache;
        this.messagingConfig = messagingConfig;
    }

    @Override
    public SessionInstanceData recoverSessionInstance(SessionInstanceDto sessionInstance) {
        SessionInstanceData sessionInstanceData = SessionInstanceHelper.recoverSessionInstance(sessionInstance);

        if (sessionInstanceData.getDeepstreamServerKey() == null) {
            String dsKey = SessionInstanceHelper.pickRandomDeepstreamServerKey(
                sessionInstanceData, messagingConfig);

这样做:

public static String pickRandomDeepstreamServerKey(
        SessionInstanceData sessionInstanceData, MessagingStreamConfiguration dsConfig) {
    // NPE occurs here
    List<String> dsKeys = new ArrayList(dsConfig.getBaseUrls().keySet()); 

这已通过Spock进行了测试。 我添加了messagingConfig,现在我正在努力使其在Spock测试中被嘲笑:

class RecoveryServiceImplTest extends Specification {

...
    MessagingStreamConfiguration msgConfig = Mock(MessagingStreamConfiguration);
    RecoveryService recoveryService = new RecoveryServiceImpl(sessionInstanceCache, attendeeCache, msgConfig);

    def "Recover session instance"() {
        ...
        def dsMap = new HashMap<String, URL>();
        dsMap.put("ds1", new URL("http://ilovemocking.com/"));

        when:
        msgConfig.getBaseUrls() >> dsMap;
        //msgConfig.getBaseUrls().keySet() >> new HashSet(){{add("ds1")}};
        recoveryService.recoverSessionInstance(sessionInstanceDto)

在对recoverSessionInstance()的呼叫中,我得到了NPE,因为getBaseUrls()返回null。

我尝试了另一种方法,将msgConfig实例化为普通对象(又称“存根”),但结果相同。

我应该如何使Spock Mock返回dsMap而不是null

1 个答案:

答案 0 :(得分:0)

最后,这是一个依赖项.jar中缺少方法的问题(与我所看到的代码相比)。 NPE来自模拟代理而不是表达式本身。但是,很难在堆栈跟踪中看到反射。

我会在一段时间内删除问题。