我正在尝试使用Maven构建一个简单的Java项目.在我的pom文件中,我声明JUnit 4.8.2是唯一的依赖项.仍然Maven坚持使用JUnit版本3.8.1.我如何解决它?
问题表现在编译失败:"package org.junit不存在".这是因为我的源代码中的import语句.JUnit 4.*中的正确包名称是org.junit.*,而在版本3中.*它是junit.framework.*
我想我已经在http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html找到了关于问题根源的文档,但是那里的建议似乎是Maven专家的意思.我不明白该怎么做.
我相信我们都知道setUp(@Before)将在任何测试方法之前执行,而tearDown(@After)将在测试方法之后执行.
我们也知道Junit将为每个测试方法创建一个Test实例.
我的问题是,我们可以将setUp方法内容移动到类Constructor并删除setUp方法吗?是否有任何特定的理由保持setUp方法?
我正在开发使用Android的java.xml.parsers.DocumentBuilder和DocumentBuilderFactory实现从XML文件加载信息的软件.我正在编写我的对象的单元测试,我需要能够提供各种xml文件来运行测试中的代码.我正在使用Eclipse并拥有一个单独的Android测试项目.我找不到将测试xml放入测试项目的方法,以便测试中的代码可以打开文件.
任何关于如何让不同的xml测试文件驻留在测试包中但对被测试代码可见的建议将不胜感激.
以下是我尝试构建单元测试的方法:
public class AppDescLoaderTest extends AndroidTestCase
{
private static final String SAMPLE_XML = "sample.xml";
private AppDescLoader m_appDescLoader;
private Application m_app;
protected void setUp() throws Exception
{
super.setUp();
m_app = new Application();
//call to system under test to load m_app using
//a sample xml file
m_appDescLoader = new AppDescLoader(m_app, SAMPLE_XML, getContext());
}
public void testLoad_ShouldPopulateDocument() throws Exception
{
m_appDescLoader.load();
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为SAMPLE_XML文件位于测试的上下文中,但AndroidTestCase正在为被测系统提供上下文,该系统无法从测试包中看到资产.
这是每个答案给出的修改后的代码:
public class AppDescLoaderTest extends InstrumentationTestCase
{
...
protected void setUp() …
Run Code Online (Sandbox Code Playgroud) 我知道这是不好的做法,但需要做,或者我需要切换到testng
.是否有类似于JUnit 3的testSuite的方法来指定要在类中运行的测试的顺序?
正如Android的文档所说,"请注意,Android测试API支持JUnit 3代码样式,但不支持JUnit 4." (测试基础).应该很清楚,JUnit 4不能与Android一起使用.
但为什么会这样呢?是因为测试是在DVM中执行的(因为Android Runtime只支持JUnit 3)?在JVM上,它本身可以选择应该使用的JUnit运行时.在DVM中这不可能吗?
在我的测试用例中,我得到一个整数值:
int val = getXXX();
Run Code Online (Sandbox Code Playgroud)
然后,我想检查是否val
等于3或等于5,这两种情况都可以.所以我做了:
assertTrue(val == 3 || val==5);
Run Code Online (Sandbox Code Playgroud)
我运行我的测试,日志显示val
是5,但我的上述断言代码失败了AssertionFailedError.似乎我不能assertTrue(...)
以这种方式使用,那么,如何检查OR条件的真实性?
我正在使用类似这样的目标通过Ant运行JUnit:
<target name="junit" depends="compile">
<mkdir dir="${report.dir}"/>
<junit printsummary="yes" haltonfailure="yes" showoutput="yes" >
<classpath>
<path refid="classpath"/>
<path location="${classes.dir}"/>
</classpath>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
<batchtest fork="yes" todir="${report.dir}">
<fileset dir="${src.dir}" includes="**/*Tests.java" />
</batchtest>
</junit>
</target>
Run Code Online (Sandbox Code Playgroud)
我有一个这样的课:
public class UserTests extends TestCase {
public void testWillAlwaysFail() {
fail("An error message");
}
public void testWillAlwaysFail2() {
fail("An error message2");
}
}
Run Code Online (Sandbox Code Playgroud)
haltonfailure="yes"
一旦单个测试失败,似乎导致构建停止,仅记录第一个失败的测试.将其设置为"off"会导致整个构建成功(即使测试失败消息写入输出).
我希望它运行所有测试(即使一个失败),然后在任何测试失败时停止构建.
是否有可能做到这一点?
我想写一个测试IndexOutOfBoundsException
.请记住,我们应该使用JUnit 3.
我的代码:
public boolean ajouter(int indice, T element) {
if (indice < 0 || indice > (maListe.size() - 1)) {
throw new IndexOutOfBoundsException();
} else if (element != null && !maListe.contains(element)) {
maListe.set(indice, element);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
经过一些研究,我发现你可以使用JUnit 4来实现这一点,@Test(expected = IndexOutOfBoundsException.class)
但是我没有在JUnit 3中找到如何做到这一点.
如何使用JUnit 3进行测试?
当我运行以下代码时,两个测试用例都成为现实:
import static junit.framework.Assert.assertEquals;
import org.junit.Test;
public class MyTest{
private int count;
@Before
public void before(){
count=1;
}
@Test
public void test1(){
count++;
assertEquals(2, count);
}
@Test
public void test2(){
count++;
assertEquals(2, count);
}
}
Run Code Online (Sandbox Code Playgroud)
预期的行为
实际行为
为什么junit适用reinitializing class/variable
于每个测试方法调用.这是junit中的错误或故意提供.