我想为大量代码编写测试用例,我想知道JUnit @Rule注释功能的细节,以便我可以用它来编写测试用例.请提供一些好的答案或链接,通过一个简单的例子详细说明其功能.
当我查看Assert类JavaDoc中的示例时
assertThat("Help! Integers don't work", 0, is(1)); // fails:
// failure message:
// Help! Integers don't work
// expected: is <1>
// got value: <0>
assertThat("Zero is one", 0, is(not(1))) // passes
Run Code Online (Sandbox Code Playgroud)
比方说,我没有看到一个很大的优势assertEquals( 0, 1 ).
如果构造变得更复杂但是你看到更多的优点,那么对于消息可能很好吗?可读性?
我有这样的代码片段:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Thread.class})
public class AllMeasuresDataTest {
@Before
public void setUp() throws Exception {
}
@Test
public void testGetMeasures() {
AllMeasuresData measure = new AllMeasuresData();
assertEquals(measure.getMeasures(), null);
HashMap<String, Measure> map = new HashMap<String, Measure>();
measure.setMeasures(map);
assertEquals(measure.getMeasures(), map);
measure.setMeasures(null);
assertEquals(measure.getMeasures(), null);
}
@Test
public void testAllMeasuresData() throws IOException {
ClassLoader loader = PowerMockito.mock(ClassLoader.class);
Thread threadMock = PowerMockito.mock(Thread.class);
Vector<URL> vec = new Vector<URL>();
Mockito.when(loader.getResources("measure")).thenReturn(vec.elements());
Mockito.when(threadMock.getContextClassLoader()).thenReturn(loader);
PowerMockito.mockStatic(Thread.class);
Mockito.when(Thread.currentThread()).thenReturn(threadMock);
...
}
}
Run Code Online (Sandbox Code Playgroud)
在运行此测试时,我得到了:
java.lang.LinkageError: loader constraint violation: loader (instance of org/powermock/core/classloader/MockClassLoader) previously initiated loading …Run Code Online (Sandbox Code Playgroud) 我继承了Junit测试的负载,但是这些测试(除了大多数不工作之外)是实际单元测试和集成测试(需要外部系统,db等)的混合.
所以我试图想出一种方法来实际将它们分开,这样我就可以很好地快速运行单元测试,然后进行集成测试.
选项是......
将它们拆分为单独的目录.
移至Junit4(从v3开始)并注释类以将它们分开.
使用文件命名约定来告诉类是什么,即AdapterATest和AdapterAIntergrationTest.
3存在Eclipse可以选择"在所选项目/包或文件夹中运行所有测试"的问题.因此,只需运行集成测试就很难了.
2:冒着开发人员可能开始在单元测试类中编写集成测试的风险,它只会变得混乱.
1:似乎是最好的解决方案,但我的直觉说必须有一个更好的解决方案.
所以这就是我的问题,你如何分解集成测试和适当的单元测试?
我将版本junit升级到4.11并得到:
[WARNING] [deprecation] Assert in junit.framework has been deprecated
[WARNING] [deprecation] Assert in junit.framework has been deprecated
....
Run Code Online (Sandbox Code Playgroud)
如何迁移?
在JUnit测试用例中实际使用'fail'是什么?
我的Java测试在Eclipse中运行良好.但现在,当我从运行菜单重新启动测试时,我收到以下消息:
No tests found with test runner 'JUnit 4'
Run Code Online (Sandbox Code Playgroud)
在.classpath文件中我有所有jar文件,最后有:
<classpathentry exported="true" kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="output" path="bin"/>
</classpath>
Run Code Online (Sandbox Code Playgroud)
如何解决此错误并让测试再次运行?
假设我想使用此签名对方法进行单元测试:
List<MyItem> getMyItems();
Run Code Online (Sandbox Code Playgroud)
假设MyItem是一个Pojo,它有许多属性,其中一个是"name"通过访问的getName().
我关心验证的是List<MyItem>,或者任何Iterable,包含两个MyItem实例,其"name"属性具有值"foo"和"bar".如果任何其他属性不匹配,我真的不关心此测试的目的.如果名称匹配,则是成功的测试.
如果可能的话,我希望它是单行的.这是我想要做的事情的一些"伪语法".
assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});
Run Code Online (Sandbox Code Playgroud)
哈姆克雷斯特会对这类事情有好处吗?如果是这样,我上面的伪语法的hamcrest版本到底是什么?
在编写新的jUnit4测试时,我想知道是否使用@RunWith(MockitoJUnitRunner.class) 或MockitoAnnotations.initMocks(this).
我创建了一个新测试,向导自动使用Runner生成测试.MockitoJUnitRunner的Javadocs说明如下:
与JUnit 4.4及更高版本兼容,此运行器添加了以下行为:
初始化用Mock注释的模拟,因此不需要明确使用MockitoAnnotations.initMocks(Object).在每种测试方法之前初始化模拟.验证每个测试方法后的框架使用情况.
我不清楚使用Runner是否比我过去使用的initMocks()方法有任何优势.
任何想法或链接将不胜感激!
我知道如何使用PowerMock从类中模拟静态方法.
但我想使用JUnit和PowerMock从测试类中的多个类中模拟静态方法.
任何人都可以告诉我是否可以这样做以及如何做到这一点?
junit4 ×10
java ×8
junit ×6
unit-testing ×3
hamcrest ×2
mockito ×2
powermock ×2
testing ×2
eclipse ×1
junit-rule ×1
linkageerror ×1