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

斯波克-嘲笑外部服务

齐兴运
2023-03-14

我在spock框架测试方面是非常新的,我没有找到任何可以找到所需信息的例子。因此,我认为最好的方法是向一个例子展示我需要拥有的东西。

>

  • 例如。斯波克的测试类:

    def "getData" (){ // this is test of getData method from ExternalService
      when:
        Result result = externalService.getData()
      then:
        result.msg = 'SUCCESS'
    }
    
    public class ExternalService(){
      private ServiceConnector serviceConnector;
    
      public Result getData(){
        Result result = serviceConnector.callAndGet(); 
        prepareInformation(data);
        updateStatuses(data);
        return result;
      }
    }
    

    将数据作为域类:

    public class Data {
      private String msg
      private int Id
      // +getters/setters
    }
    

    现在我有了getData测试,并且想模拟唯一的方法callandget()。这意味着每次调用CallandGet时,都需要有msg成功的对象数据,但是GetData方法中的所有其他方法都应该正常调用。

    很可以理解吗?问题是如何将服务类ExternalService注入/模拟到spock测试类中?

  • 共有1个答案

    温浩大
    2023-03-14

    您需要做的是模拟ServiceConnector类并通过构造函数传递它(例如)。见下文:

    @Grab('org.spockframework:spock-core:1.0-groovy-2.4')
    @Grab('cglib:cglib-nodep:3.1')
    
    
    import spock.lang.*
    
    class Test extends Specification {
        def 'some spec'() {
            given:    
                def serviceConnector = Mock(ServiceConnector) {
                    callAndGet() >> new Result(msg: 'SUCCESS')
                }
                def externalService = new ExternalService(serviceConnector)
    
            when:
                Result result = externalService.getData()
    
            then:
                result.msg == 'SUCCESS'
        }
    }
    
    public class ExternalService {
      private ServiceConnector serviceConnector
    
      public ExternalService(ServiceConnector serviceConnector) {
          this.serviceConnector = serviceConnector
      }
    
      public Result getData() {
        Result result = serviceConnector.callAndGet()
    
        prepareInformation(result)
        updateStatuses(result)
        result
      }
    
      private void prepareInformation(Result data) {
      }
    
      private void updateStatuses(Result data) {
      }
    }
    
    public class ServiceConnector {
        public Result callAndGet() {
    
        }    
    }
    
    public class Result {
        String msg
    }
    
     类似资料:
    • 我在一个Java项目中工作,并开始使用Spock框架在Groovy中编写单元测试。但我对Spock的嘲讽功能有意见,希望有人能找出我做错了什么。 然后,我使用Spock在Groovy中编写了以下单元测试: 此测试失败如下: dofoo调用getfoo:21没有可用的foo

    • 我有Kotlin课程和Groovy/Spock测试。当我模拟一个Kotlin类并在该模拟上设置一个属性值时,它无法传递到Kotlin。 下面是一个Kotlin实体类,以及一个使用它的类: 已经尝试过: 使用GroovyStub()而不是GroovyMock()-没有区别 使用Mock()/stub()而不是GroovyMock()-那么该属性在所有println的even Groovy(!!?)

    • 我提到了这个答案,我该如何模拟java。时间本地日期。now()关于如何模拟我的LocalDateTime。now()调用。我基本上遵循了所有步骤,但只使用了LocalDateTime而不是LocalDate。 我的代码的功能是这样的,它应该只在一小时的第15或45分钟运行。因此,我将LOCAL\u DATE\u TIME静态变量设置为: 然后在我的@Before测试方法中,我有以下内容: 这是2

    • 我在spock和groovy的初始阶段,我试图测试一个简单的Spring启动应用程序,并获得 下面是我的java和groovy代码以及异常详细信息 TestController.java TestControllerSpec。棒极了 我确信我的代码遗漏了什么

    • 我有一个关于SPOCK+Drools测试的问题。事情是这样的, 我正在部署的webapp W/O中运行测试(如果这有任何意义的话:))。我将jar添加到类路径中(而不是WEB-INF/libs),现在运行良好。

    • 运行jUnit时的异常 我想测试这个类,下面是测试方法 运行junit会产生以下异常