使用junit测试Java静态私有方法,通过以下案例进行分析:
测试目标类如下:
package cnoutofmemoryjunit;public class TestTarget {
/
移除正则表达式中需要转义的字符
@param w word
@return 移除正则表达式中需要转义的字符
@author Administrator
@date 2015-7-11
/
private static String convert4Regex(String w) {
if (w == null) {
return null;
}
String[] convertedChars = {"\\","","+","","(",")","{","}","[","]","","/","^","$","|"};
for (String c : convertedChars) {
w = wreplace(c, "\\" + c);
}
return w;
}
}
测试方法:
@Testpublic void testConvert4Regex() throws Exception {
String input = "A+";
String expected = "A\\+";
Method targetMethod = TestTargetclassgetDeclaredMethod("convert4Regex", Stringclass);
targetMethodsetAccessible(true);
Object actual = targetMethodinvoke(TestTargetclass, new Object[]{input});
assertEquals(expected,actual);
}
JUnit是一个开发源代码的Java测试框架 用于编写和运行可重复的测试 他是用于单元测试框架体系xUnit的一个实例(用于java语言) 它包括以下特性 用于测试期望结果的断言(Assertion) 用于共享共同测试数据的测试工具 用于方便的组织和运行测试的测试套件 图形和文本的测试运行器
JUnit最初是由Erich Gamma(GoF之一)和Kent Beck(xp和refactor的先驱之一)编写的 需要说明的是JUnit一般是用来进行单元测试的 因此需要了解被测试代码的内部结构(即所谓的白盒测试) 另外junit是在xp编程和重构(refactor)中被极力推荐使用的工具 因为在实现自动单元测试的情况下可以大大的提高开发的效率 但是实际上编写测试代码也是需要耗费很多的时间和精力的 那么使用这个东东好处到底在哪里呢?笔者认为是这样的 对于xp编程而言 要求在编写代码之前先写测试 这样可以强制你在写代码之前好好的思考代码(方法)的功能和逻辑 否则编写的代码很不稳定 那么你需要同时维护测试代码和实际代码 这个工作量就会大大增加 因此在xp编程中 基本过程是这样的 构思-》编写测试代码-》编写代码-》测试 而且编写测试和编写代码都是增量式的 写一点测一点 在编写以后的代码中如果发现问题可以较块的追踪到问题的原因 减小回归错误的纠错难度 对于重构而言 其好处和xp编程中是类似的 因为重构也是要求改一点测一点 减少回归错误造成的时间消耗 对于非以上两种情况 我们在开发的时候使用junit写一些适当的测试也是有必要的 因为一般我们也是需要编写测试的代码的 可能原来不是使用的junit 如果使用junit 而且针对接口(方法)编写测试代码会减少以后的维护工作 例如以后对方法内部的修改(这个就是相当于重构的工作了) 另外就是因为junit有断言功能 如果测试结果不通过会告诉我们那个测试不通过 为什么 而如果是想以前的一般做法是写一些测试代码看其输出结果 然后再由自己来判断结果使用正确 使用junit的好处就是这个结果是否正确的判断是它来完成的 我们只需要看看它告诉我们结果是否正确就可以了 在一般情况下会大大提高效率
安装JUnit
安装很简单 先到以下地址下载一个最新的zip包 //download sourcefe net/junit/下载完以后解压缩到你喜欢的目录下 假设是JUNIT_HOME 然后将JUNIT_HOME下的junit jar包加到你的系统的CLASSPATH环境变量中 对于IDE环境 对于需要用到的junit的项目增加到lib中 其设置不同的IDE有不同的设置 这里不多讲 如何使用JUnit写测试?
最简单的范例如下
创建一个TestCase的子类package junitfaq; import java util ;import junit framework ; public class SimpleTest extends TestCase { public SimpleTest(String name) {super(name);}
lishixinzhi/Article/program/Java/ky/201311/29247
分类: 电脑/网络 >> 互联网
问题描述:
能用平实易于理解的语言详细的说一下么?
谢谢
解析:
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。
首先我们需要先下载相应的 JUnit 相关的 JAR 包,下载的过程可以去 JUnit 的官方网站,也可以直接通过 Maven 资源仓库来完成。
使用简单的 @Test 注解实现我们的测试方法的编写和执行
准备工作做好之后,接下来我们就可以开始尝试编写壹个简单的测试代码了。首先,我们编写了壹个 Calculator 类,并提供五个方法分别完成加减乘除以及求平方的运算。代码如下:
package netoschinabairrfhoinnmain;
public class Calculator {
public void add(int n){
result += n;
}
public void substract(int n){
result -= n;
}
public void multiply(int n){
result = n;
}
public void divide(int n){
result /= n;
}
public void square(int n){
result = n n;
}
public int getReuslt(){
return result;
}
public void clear(){
result = 0;
}
private static int result;
}
在测试类中用到了JUnit4框架,自然要把相应地Package包含进来。最主要地一个Package就是orgjunit。把它包含进来之后,绝大部分功能就有了。还有一句话也非常地重要“import static orgjunitAssert;”,我们在测试的时候使用的壹系列assertEquals()方法就来自这个包。大家注意壹下,这是壹个静态包含(static),是JDK5中新增添的壹个功能。也就是说,assertEquals是Assert类中的壹系列的静态方法,壹般的使用方式是Assert assertEquals(),但是使用了静态包含后,前面的类名就可以省略了,使用起来更加的方便。
另外要注意的是,我们的测试类是壹个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。所以我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部的方法的声明,我们接着会讲到。在测试类中,并不是每壹个方法都是用于测试的,所以我们必须使用“注解”来明确表明哪些是测试方法。“注解”也是JDK5的壹个新特性,用在此处非常恰当。我们可以看到,在某些方法的前有@Before、@Test、@Ignore等字样,这些就是注解,以壹个“@”作为开头。这些注解都是JUnit4自定义的,熟练掌握这些注解的含义,对于编写恰当的测试类非常重要。
接下来我们创建壹个测试类 CalculatorTestjava,代码如下:
package netoschinabairrfhoinntest;
import static orgjunitAssert;
import orgjunitTest;
import netoschinabairrfhoinnmainCalculator;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Test
public void testAdd(){
calculatoradd(7);
calculatoradd(8);
assertEquals(15, calculatorgetReuslt());
}
}
首先,我们要在方法的前面使用@Test标注,以表明这是壹个测试方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出壹个异常。至于方法内该写些什么,那就要看你需要测试些什么了。比如上述代码中,我们想测试壹下add()方法的功能是否正确,就在测试方法中调用几次add函数,初始值为0,先加7,再加8,我们期待的结果应该是15。如果最终实际结果也是15,则说明add()方法是正确的,反之说明它是错的。assertEquals(15, calculatorgetResult());就是用来判断期待结果和实际结果是否相等,其中第壹个参数填写期待结果,第二个参数填写实际结果,也就是通过计算得到的结果。这样写好之后,JUnit 会自动进行测试并把测试结果反馈给用户。
如果想运行它,可以在 eclipse 的资源管理器中选择该类文件,然后点击右键,选择 Run As->JUnit Test 即可看到运行结果。
使用@Test 的属性 Ignore 指定测试时跳过这个方法
如果在写程序前做了很好的规划,那么哪些方法是什么功能都应该实现并且确定下来。因此,即使该方法尚未完成,他的具体功能也是确定的,这也就意味着你可以为他编写测试用例。但是,如果你已经把该方法的测试用例写完,但该方法尚未完成,那么测试的时候无疑是“失败”。这种失败和真正的失败是有区别的,因此 JUnit 提供了壹种方法来区别他们,那就是在这种测试函数的前面加上 @Ignore 标注,这个标注的含义就是“某些方法尚未完成,暂不参与此次测试”。这样的话测试结果就会提示你有几个测试被忽略,而不是失败。壹旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。
比如说上面的测试类 Calculatorjava 中,假设我们的 Calculator 类的 multiply() 方法没有实现,我们可以在测试类 CalculatorTest 中先写如下测试代码:
package netoschinabairrfhoinntest;
import static orgjunitAssert;
import orgjunitIgnore;
import orgjunitTest;
import netoschinabairrfhoinnmainCalculator;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
//此处代码省略
@Ignore("method square() not implemented, please test this later")
@Test
public void testSquare(){
calculatorsquare(3);
assertEquals(9, calculatorgetReuslt());
}
}
javazip压缩包过大解压失败的原因:网络传输不好导致文件下载损坏、网站提供的RAR压缩包最初被损坏、使用的下载工具不够完善。我们可以通过压缩软件里的“修复压缩文件”解决javazip压缩包过大解压失败的问题。
在Spring应用中,常常会用到“接口+实现类”的形式,即要实现类又要写一个方法差不多的接口,有时候感觉比较烦琐。其实,Eclipse可以根据类自动抽取出接口来。PersonServiceImpljava的代码如下
在上面代码的空白处点右键,或者在PersonServiceImpl类名上点右键 —> Refactor –> Extract Interface,
在“在Extract Interface”对话框中,Interface name框中输入接口名:PersonService,将addPerson和queryPerson方法钩选上
点OK后,即可自动生成PersonServiceImpljava的接口类PersonServicejava
而再看看PersonServiceImpl类代码有了什么变化
自动生成Junit测试类 在类名上点右键 –> New –> Other
在新建对话框中,选择Java >> Junit >> Junit Test Case
在“New Junit Test Case”对话框中,填写测试类名,此处,用默认(PersonServiceTest)即行,如果不想测试类与PersonService类置同一包下,可在Package中选择指定的包来存放测试类,此处也默认处理
点Next后进入下图,将要测试的方法钩选中,Finish即行
如果第一次建测试类,它要求加入JUnit的jar包,点OK即行
JUnit测试类PersonServiceTestjava便自动生成了
在Eclipse中自动生成接口和JUnit测试类的方法:
1、首先新建一个项目叫JUnit_Test,以编写一个Calculator类为例来说明,这是一个能够简单实现加减乘除、平方、开方的计算器类,然后对这些功能进行单元测试。
package andycpp;
public class Calculator {private static int result; // 静态变量,用于存储运行结果
public void add(int n) {
result = result + n;
}
public void substract(int n) {
result = result - 1; //Bug: 正确的应该是 result =result-n
}
public void multiply(int n) {
} // 此方法尚未写好
public void divide(int n) {
result = result / n;
}
public void square(int n) {
result = n n;
}
public void squareRoot(int n) {
for (; ;) ; //Bug : 死循环
}
public void clear() { // 将结果清零
result = 0;
}
public int getResult() {
return result;
}
}
2、将JUnit4单元测试包引入这个项目:在该项目上点右键,点“属性”,如图:
3、在d出的属性窗口中,首先在左边选择“Java Build Path”,然后到右上选择“Libraries”标签,之后在最右边点击“Add Library…”按钮,如下图所示:
在新d出的对话框中选择JUnit4并点击确定,如上图所示,JUnit4软件包就被包含进我们这个项目了。
4、生成JUnit测试框架:在Eclipse的Package Explorer中用右键点击该类d出菜单,选择“New à JUnit Test Case”。如下图所示:
5、在d出的对话框中,进行相应的选择,如下图所示:
6、点击“下一步”后,系统会自动列出你这个类中包含的方法,选择你要进行测试的方法。此例中,我们仅对“加、减、乘、除”四个方法进行测试。如下图所示:
之后系统会自动生成一个新类CalculatorTest,里面包含一些空的测试用例。你只需要将这些测试用例稍作修改即可使用。完整的CalculatorTest代码如下:
package andycpp;import static orgjunitAssert;
import orgjunitBefore;
import orgjunitIgnore;
import orgjunitTest;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Before
public void setUp() throws Exception {
calculatorclear();
}
@Test
public void testAdd() {
calculatoradd(2);
calculatoradd(3);
assertEquals(5, calculatorgetResult());
}
@Test
public void testSubstract() {
calculatoradd(10);
calculatorsubstract(2);
assertEquals(8, calculatorgetResult());
}
@Ignore("Multiply() Not yet implemented")
@Test
public void testMultiply() {
}
@Test
public void testDivide() {
calculatoradd(8);
calculatordivide(2);
assertEquals(4, calculatorgetResult());
}
}
7、运行测试代码:按照上述代码修改完毕后,我们在CalculatorTest类上点右键,选择“Run As à JUnit Test”来运行我们的测试,如下图所示:
8、运行结果如下:
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
解析:
JUnit是Java进行单元测试的一个框架, 需要下载junit, 38版本和后来的40以后版本编写测试的方法略有不同,
在382中需要导入junitframework中的类, 进行测试的类必须继承自TestCase类, 测试方法名称中需要含test字样, 可以在setup和teardown函数中管理一些每个测试函数都需要的资源比如数据库连接等,在测试函数中使用assert开头的函数来进行测试代码开发以下是从junit文档中摘出的范例:
import junitframeworkTest;
import junitframeworkTestCase;
import junitframeworkTestSuite;
/
Some simple tests
/
public class SimpleTest extends TestCase {
protected int fValue1;
protected int fValue2;
protected void setUp() {
fValue1= 2;
fValue2= 3;
}
public static Test suite() {
/
the type safe way
TestSuite suite= new TestSuite();
suiteaddTest(
new SimpleTest("add") {
protected void runTest() { testAdd(); }
}
);
suiteaddTest(
new SimpleTest("testDivideByZero") {
protected void runTest() { testDivideByZero(); }
}
);
return suite;
/
/
the dynamic way
/
return new TestSuite(SimpleTestclass);
}
public void testAdd() {
double result= fValue1 + fValue2;
// forced failure result == 5
assertTrue(result == 6);
}
public void testDivideByZero() {
int zero= 0;
int result= 8/zero;
result++; // avoid warning for not using result
}
public void testEquals() {
assertEquals(12, 12);
assertEquals(12L, 12L);
assertEquals(new Long(12), new Long(12));
assertEquals("Size", 12, 13);
assertEquals("Capacity", 120, 1199, 00);
}
public static void main (String[] args) {
junittextuiTestRunnerrun(suite());
}
}
在402中的变化是:
测试需要@junitTest的Annotation标记,其他部分也使用了Annotation标记,setup和teardown使用@junitBefore 和@junitAfter, 在eclipse31的环境中不支持402, 可以使用junit 402中提供的adapter类来帮助eclipse内置的junit发现新版本的测试函数
以上就是关于JUnit test 如何做Java静态方法测试全部的内容,包括:JUnit test 如何做Java静态方法测试、名词解释 什么是JUnit[1]、junit是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)