如何创建只能用于测试的方法

时间:2017-07-02 16:00:45

标签: java testing junit

是否有任何方法可以创建只能在Junit中使用的方法/承包商(仅限测试用途)?

也许有注释?

3 个答案:

答案 0 :(得分:1)

没有任何东西可以阻止调用方法"外部"一个junit测试用例。

我的实用答案:使方法包受到保护,并添加一个简单的注释,例如"仅限单元测试"作为javadoc。并教育您的团队兑现这些陈述。

理想情况下:设计您的生产代码的方式不需要这样的"技巧"为了使它可测试!

鉴于对该问题的评论:技术上可能以某种方式获取堆栈跟踪信息;然后在相应的方法上搜索@Test注释的存在。但这似乎是绝对的矫枉过正 - 这意味着要增加更多的"仅测试"代码到生产代码中。

这也是错误的做法 - 因为它试图解决一个社会问题。使用技术手段的问题:如果您不希望人们使用某种方法 - 那么请确保他们理解

答案 1 :(得分:1)

您出于什么目的需要这种方法?

(J)UnitTests应使用公共接口验证类的行为。不#34;特别"测试代码中的方法应该用于单元测试。

但是单位测试应该用测试双打(又称假货和模拟)替换测试代码的依赖。提供这些测试双精度的首选方法是依赖注入(DI)。

有时需要付出很多努力才能将DI​​引入代码中。在这种情况下,可以引入低可见性getter方法作为接缝,其中依赖项可以由mock替换。

class CodeUnderTest{
  private final SomeOtherClass dependency = new SomeOtherClass();
  SomeOtherClass getDependency(){ // package private getter
    return dependency;
  }
  public void doSomething(){
     dependency.expectedMethodCalled();
  }
}
class TestInSamePackage{
     @Rule
     public MockitoRule rule = MockitoJUnit.rule();

     @Mock
     private SomeOtherClass testDouble;

     @Spy
     private CodeUnderTest cut;

     @Before
     public void setup(){
       doReturn(testDouble).when(cut).getDependency();
     }

     @Test
     public void shouldDoSomething() {
         // configure testDouble

         cut.doSomething();

         verify(testDouble).expectedMethodCalled();
     }
}

答案 2 :(得分:1)

对于仅用于测试的方法...为什么不将它们作为实际测试代码的一部分?至少在诸如Maven之类的构建系统中,测试代码不包含在打包的jar中,并且仅作为源的一部分分发。从这个意义上说,它不能从普通类中调用,因为它根本不包含在最终的.jar(或.war)中。

我经常编写这样的方法来使我的测试代码更易于维护。

澄清:

src/
  main/
    java/
      my/package/
        MyClass.java <-- leave necessary protected accessors here
  test/
    java/
      my/package/
        MyClassTest.java <-- implement test-code here

并在MyClassTest ...

public class MyClassTest {

   ...

   private static Foo doSomethingCoolButTesty(MyClass instance) {
       // access protected or package-private MyClass code here 
   }
}

MyClassTest.doSomethingCoolButTesty将与主代码分开,显然只能用于测试代码。是的,它比将其作为主要代码的方法包含起来有点丑陋,但我觉得要付出合理的代价。