【问题标题】:[JUnit Unit test cases]: java.lang.NoClassDefFoundError: org/apache/commons/logging/Log【JUnit单元测试用例】:java.lang.NoClassDefFoundError: org/apache/commons/logging/Log
【发布时间】:2016-09-30 08:47:24
【问题描述】:

在我模拟时获取 java.lang.NoClassDefFoundError: org/apache/commons/logging/Log。参考代码 @Mock private RestTemplate restTemplate;

我们包含的依赖项

testCompile "org.apache.logging.log4j:log4j-slf4j-impl:2.5" testCompile "org.apache.logging.log4j:log4j-core:2.5" testCompile "org.slf4j:jcl-over-slf4j:1.7.21" testCompile "commons-logging:commons-logging:1.1.1"

注意:我们使用的是 slf4j 日志记录。 对于实际应用,这些依赖关系由 tomcat 服务器解决。

【问题讨论】:

    标签: spring unit-testing junit mockito


    【解决方案1】:

    您需要记住的第一件事是——“您正在使用模拟对象”并且模拟只是一个占位符,它不是真实的对象。因此,您必须定义其行为和依赖关系。该模板被定义为模拟,因此您必须注入任何依赖对象,例如记录器。你可以通过使用这样的东西来实现这一点

    @RunWith(MockitoJUnitRunner.class)
    public class MyTest {
    
    @Mock
    Logger logger;
    
    @InjectMocks
    private RestTemplate restTemplate;
    
    @Test
        public void isLoggerGettingCalled() throws Exception {
          // Your test logic
    }
    
    }
    

    【讨论】:

      【解决方案2】:

      我认为这是您实际上并没有错过特定课程但拥有一对多课程的罕见情况之一。如果您检查您导入的这两个罐子:

      testCompile "org.slf4j:jcl-over-slf4j:1.7.21"
      testCompile "commons-logging:commons-logging:1.1.1"
      

      你会看到,它们都有以下类:

      org/apache/commons/logging/Log
      

      类加载器遇到这种重复,无法加载类定义。如果您正在寻找 slf4j jar 的正确组合,我会选择以下两个选项之一:

      slf4j-api-[latest-version].jar
      slf4j-simple-[latest-version].jar
      

      slf4j-api-[latest-version].jar
      slf4j-log4j12-[latest-version].jar
      log4j-[latest-version].jar
      

      但最终有很多组合可供选择,具体取决于您的喜好。

      【讨论】:

      • 类加载器在找到第一个类时停止搜索;因此,如果在运行时类路径下还有另一个,则没有区别。
      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2019-06-01
      相关资源
      最近更新 更多