Spock测试在模拟RestTemplate时得到了NoClassDefFoundError:net / bytebuddy / TypeCache

时间:2019-02-06 23:09:00

标签: spring groovy spock

我正在测试我的DAO类,该类使用自定义的RestTemplate扩展了RestTemplate来执行postForObject,但是即使将字节伙伴的依赖项添加到pom.xml,也遇到了以下错误。调用Mock()时似乎发生此错误。有人可以让我知道我做错了吗?

 NoClassDefFoundError: net/bytebuddy/TypeCache

  <dependency>
    <groupId>net.bytebuddy</groupId>
    <artifactId>byte-buddy</artifactId>
    <version>1.3.16</version>
    <scope>test</scope> <!--also tried giving "runtime" here -->
 </dependency>       

我的道课:

@Component
public class DaoClass {

   @Autowired
   private MyCustomRestTemplate restTemplate;

   public SomeObjectType getAddressFromSomewhere(
       String url, String request) {
     ......
     return restTemplate.postForObject(url, request, SomeObjectType.class);     
 }
}

我已经建立了一个TestConfiguration类,以便在测试中使用测试restTemplate bean:

    @Configuration
    public class TestConfiguration {

        @Bean
        public MyCustomRestTemplate restTemplate() {
            return new MyCustomRestTemplate();
    }
}

这是我的Spock代码,其中我模拟了restTemplate postForObject:

@ContextConfiguration(classes = [TestConfiguration.class])
@Import([DaoClass.class])
public class TestDao extends Specification {

@Autowired
private DaoClass dao;

//got the same error regardless of using @SpringBean or @TestConfiguration
@SpringBean
MyCustomRestTemplate restTemplate = Mock() //***** Error occurred here

def "Test Success Senario"() {

    def obj = .... // get object

    given: "rest template"             
    1 * restTemplate.postForObject(_, _, _) >> obj

    when: "we call Dao"
    def actualResponse = dao.getAddressFromSomewhere(_);

    then: "we get response"
    actualResponse == obj
}

// got the same error regardless of using @SpringBean or @TestConfiguration
/*
@TestConfiguration
static class MockConfig {
    def detachedMockFactory = new DetachedMockFactory()

    @Bean
    MyCustomRestTemplate restTemplate() {
        return detachedMockFactory.Mock(MyCustomRestTemplate )
    }
} 
*/
}

1 个答案:

答案 0 :(得分:3)

TypeCache<T>类是在字节伙伴1.6.0中引入的,因此您至少需要此版本。 Spock使用可选的字节伙伴关系,这意味着您在pom.xml中指定的版本优先。根据Spock版本的不同,以下是特定Spock版本使用的字节伙伴版本:

  • spock-core:1.2-groovy-2.4 =>字节好友:1.8.21
  • spock-core:1.1-groovy-2.4 =>字节伙伴:1.6.5

将字节伙伴的依赖关系版本更新为以下版本之一,它将解决您的问题。