是否有任何方法可以创建只能在Junit中使用的方法/承包商(仅限测试用途)?
也许有注释?
答案 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
将与主代码分开,显然只能用于测试代码。是的,它比将其作为主要代码的方法包含起来有点丑陋,但我觉得要付出合理的代价。