Java 在运行一些JUnit测试时,如何替换某个类?

Java 在运行一些JUnit测试时,如何替换某个类?,java,junit,mocking,Java,Junit,Mocking,我在JUnit4.8.1(和Maven 3.0.3)中使用Java6。对于某些JUnit测试,我想用我自己版本的此类(具有相同的公共方法签名)替换一些测试所依赖的类(限定为com.myco.clearing.product.server.cache)。这样做的优雅方式是什么 注意,一些JUnit测试不直接调用com.myco.clearing.product.server.cache.cache类,而是调用依赖于该类的类。即使在这些间接情况下,我也希望使用我的类版本 感谢您在这些方面提供的帮助,

我在JUnit4.8.1(和Maven 3.0.3)中使用Java6。对于某些JUnit测试,我想用我自己版本的此类(具有相同的公共方法签名)替换一些测试所依赖的类(限定为com.myco.clearing.product.server.cache)。这样做的优雅方式是什么

注意,一些JUnit测试不直接调用com.myco.clearing.product.server.cache.cache类,而是调用依赖于该类的类。即使在这些间接情况下,我也希望使用我的类版本

感谢您在这些方面提供的帮助,-Dave

很难说清楚该怎么做,但一般来说:

  • 使用一些IoC技术-构造函数、setter注入

  • 我建议使用模拟框架来模拟对象 莫基托

  • 因此,例如,如果您有一个使用
    com.myco.clearing.product.server.cache.cache
    的类,我们就称它为
    Foo
    。你现在用这个:

    class Foo {
     private Cache _cache = new Cache( ... );
    }
    
    class Foo {
        private Cache _cache;
    
        public Foo( Cache cache ) {
          _cache = cache;
        }
    
        public Foo() {
          this( new Cache() );
        }
    }
    
    如果可能,将其更改为以下内容:

    class Foo {
     private Cache _cache = new Cache( ... );
    }
    
    class Foo {
        private Cache _cache;
    
        public Foo( Cache cache ) {
          _cache = cache;
        }
    
        public Foo() {
          this( new Cache() );
        }
    }
    
    然后,您可能能够插入
    缓存
    类的模拟版本。我说“可能能够”,因为它取决于
    缓存
    类。如果它是final,有一堆静态方法等,那么您还有更多的事情要处理。

    等等,您的测试是否依赖于缓存?或者被测单元是依赖于缓存的单元?(我知道缓存只是一个例子)