如何使用JUnit在Java中测试抽象类?

我是JUnit的Java测试新手。 我必须使用Java,我想使用单元测试。

我的问题是:我有一个带有一些抽象方法的抽象类。 但是有些方法并不是抽象的。 如何使用JUnit测试此类? 示例代码(非常简单):

abstract class Car {

public Car(int speed, int fuel) {

this.speed = speed;

this.fuel = fuel;

}

private int speed;

private int fuel;

abstract void drive();

public int getSpeed() {

return this.speed;

}

public int getFuel() {

return this.fuel;

}

}

我想测试getSpeed()和getFuel()功能。

这个问题的类似问题在这里,但它没有使用JUnit。

在JUnit FAQ部分中,我找到了这个链接,但我不明白作者想用这个例子说些什么。 这行代码是什么意思?

public abstract Source getSource() ;

10个解决方案

99 votes

如果您没有该类的具体实现,并且方法不是protected那么测试它们的重点是什么? 如果你有一个具体的类,那么你将测试这些方法作为具体类的公共API的一部分。

我知道你在想什么“我不想一遍又一遍地测试这些方法,这就是我创建抽象类的原因”,但我反驳的是单元测试的重点是允许开发人员进行更改, 运行测试,并分析结果。 这些变化的一部分可能包括覆盖抽象类的方法,protected和public,这可能导致基本的行为变化。 根据这些更改的性质,它可能会影响您的应用程序以意外的方式运行,可能是负面的方式。 如果您有一个好的单元测试套件,这些类型引起的问题在开发时应该是明显的。

nsfyn55 answered 2019-05-16T21:27:38Z

26 votes

创建一个继承抽象类的具体类,然后测试具体类从抽象类继承的函数。

Kevin Bowersox answered 2019-05-16T21:28:03Z

12 votes

使用您发布的示例类,测试TestCase和getSpeed()似乎没有多大意义,因为它们只能返回0(没有setter)。

但是,假设这仅仅是用于说明目的的简化示例,并且您有合理的理由在抽象基类中测试方法(其他人已经指出了其含义),您可以设置测试代码以便创建匿名 基类的子类,它只为抽象方法提供虚拟(无操作)实现。

例如,在TestCase中,您可以这样做:

c = new Car() {

void drive() { };

};

然后测试其余的方法,例如:

public class CarTest extends TestCase

{

private Car c;

public void setUp()

{

c = new Car() {

void drive() { };

};

}

public void testGetFuel()

{

assertEquals(c.getFuel(), 0);

}

[...]

}

(这个例子基于JUnit3语法。对于JUnit4,代码会略有不同,但想法是一样的。)

Grodriguez answered 2019-05-16T21:28:55Z

7 votes

如果你还需要一个解决方案(例如,因为你有太多的抽象类实现,并且测试总是会重复相同的过程),那么你可以使用抽象工厂方法创建一个抽象的测试类,该方法将通过实现 考试班。 这个例子适用于TestNG:

抽象测试类ElectricCarTest:

abstract class CarTest {

// the factory method

abstract Car createCar(int speed, int fuel);

// all test methods need to make use of the factory method to create the instance of a car

@Test

public void testGetSpeed() {

Car car = createCar(33, 44);

assertEquals(car.getSpeed(), 33);

...

执行ElectricCarTest

class ElectricCar extends Car {

private final int batteryCapacity;

public ElectricCar(int speed, int fuel, int batteryCapacity) {

super(speed, fuel);

this.batteryCapacity = batteryCapacity;

}

...

类别测试类ElectricCarTest类别ElectricCar:

class ElectricCarTest extends CarTest {

// implementation of the abstract factory method

Car createCar(int speed, int fuel) {

return new ElectricCar(speed, fuel, 0);

}

// here you cann add specific test methods

...

thomas.mc.work answered 2019-05-16T21:29:40Z

4 votes

你可以这样做

public abstract MyAbstractClass {

@Autowire

private MyMock myMock;

protected String sayHello() {

return myMock.getHello() + ", " + getName();

}

public abstract String getName();

}

// this is your JUnit test

public class MyAbstractClassTest extends MyAbstractClass {

@Mock

private MyMock myMock;

@InjectMocks

private MyAbstractClass thiz = this;

private String myName = null;

@Override

public String getName() {

return myName;

}

@Test

public void testSayHello() {

myName = "Johnny"

when(myMock.getHello()).thenReturn("Hello");

String result = sayHello();

assertEquals("Hello, Johnny", result);

}

}

iil answered 2019-05-16T21:30:00Z

2 votes

您可以实例化一个匿名类,然后测试该类。

public class ClassUnderTest_Test {

private ClassUnderTest classUnderTest;

private MyDependencyService myDependencyService;

@Before

public void setUp() throws Exception {

this.myDependencyService = new MyDependencyService();

this.classUnderTest = getInstance();

}

private ClassUnderTest getInstance() {

return new ClassUnderTest() {

private ClassUnderTest init(

MyDependencyService myDependencyService

) {

this.myDependencyService = myDependencyService;

return this;

}

@Override

protected void myMethodToTest() {

return super.myMethodToTest();

}

}.init(myDependencyService);

}

}

请注意,摘要类myDependencyService的属性myDependencyService的可见性必须为protected。

您也可以将这种方法与Mockito巧妙地结合起来。 看这里。

Samuel answered 2019-05-16T21:30:39Z

2 votes

我将创建一个继承自抽象类的jUnit内部类。 这可以实例化,并且可以访问抽象类中定义的所有方法。

public class AbstractClassTest {

public void testMethod() {

...

}

}

class ConcreteClass extends AbstractClass {

}

marting answered 2019-05-16T21:31:05Z

1 votes

在每个abstractUnitTest.java中,我的测试方式非常简单。我只是在abstractUnitTest.java中创建一个扩展抽象类的类。 并以这种方式进行测试。

Haomin answered 2019-05-16T21:31:31Z

0 votes

你无法测试整个抽象类。 在这种情况下,您有抽象方法,这意味着它们应该由扩展给定抽象类的类实现。

在那个类程序员必须编写专门用于他的逻辑的源代码。

换句话说,没有测试抽象类的感觉,因为你无法检查它的最终行为。

如果您在某些抽象类中具有与抽象方法无关的主要功能,则只需创建另一个抽象方法将引发异常的类。

Damian Leszczyński - Vash answered 2019-05-16T21:32:18Z

0 votes

作为一个选项,您可以创建抽象测试类,覆盖抽象类中的逻辑,并为每个子类测试扩展它。 因此,通过这种方式,您可以确保分别为每个孩子测试此逻辑。

Andrew Taran answered 2019-05-16T21:32:45Z

java写抽象类的测试_如何使用JUnit在Java中测试抽象类?相关推荐

  1. java 写文件 权限不够_教你解决Linux系统中JAVA创建文件后权限不足的问题

    在作业中,项目使用文件上传. 这个功能很常见. 当Kai Ge今天更改其官方帐户时,他遇到了一个问题,即无法访问下载的文件,也无法通过浏览器访问该文件. 它是怎么发生的? 经过许多问题之后,事实证明这 ...

  2. python的抽象类详解_第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类...

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不是以继 ...

  3. java写七星彩兑奖_【技术分享】Java Swing界面完成七星彩抽奖系统

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; ...

  4. java写一个登录系统_用java写一个用户登陆界面

    一.课堂测试源代码及其结果截图 用java的swing写一个用户登录界面,采用网格布局.源代码如下: /** * */ package LiuLijia; import java.awt.CardLa ...

  5. java 压力测试_使用 JMeter 完成常用的压力测试

    讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确是不够的.在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度.影响软件响应速度的 ...

  6. java类的命名规范_一篇搞定Java命名规范

    好的代码本身就是注释,减少不必要的注释 驼峰命名规则 大驼峰命名 类名全部使用大驼峰 ServiceDiscovery.ServiceInstance.LruCacheFactory 小驼峰命名 方法 ...

  7. kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常

    kotlin中的异常处理 by Daniel Newton 丹尼尔·牛顿 如何使用assertFailsWith在Kotlin中测试异常 (How to test exceptions in Kotl ...

  8. java webservice报文过长_工作1-5年的Java程序猿到底需要怎样的一个技术栈?

    工作1-5年的Java程序猿到底需要怎样的一个技术栈? 前言: 具有1-5年开发经验的程序员 需要学习的内容其实还有很多很多. 今天跟大家交流一下希望分享出来的对大家能够有帮助,这是我这些年总结出的一 ...

  9. java编程控制电脑硬件_如何快速学习AP计算机中的Java编程?

    AP Computer Science A (APCSA)考试,需要掌握Java编程语言.对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构. 多编程零基础的高中生,在自学一段时间内, ...

最新文章

  1. 华东师范大学2019年高等代数考研试题
  2. Android系统Surface机制的SurfaceFlinger服务的线程模型分析
  3. 客户资产管理(Custom Asset Management)
  4. Linux服务器Zookeeper+Dubbo环境搭建
  5. 通用mapper如何处理多表条件查询通过list封装(强烈不推荐)(一对一,一对多)
  6. 系统机构设计师 - 软件质量属性
  7. hadoop--集群时间同步(可不同步)
  8. Web渗透测试常规套路
  9. greenplum 替代mysql_转:MySQL到Greenplum迁移分析
  10. TIOBE 3 月编程语言排行榜:Ruby 重回前十,Kotlin 突围
  11. 数据之美系列5(转载)
  12. 通俗易懂的USB协议详解(转)
  13. Python学习笔记-基础篇
  14. 基于原理图法的全加器设计
  15. 张一鸣的大学四年收获及工作感悟
  16. html中如何使图片边框隐藏,css怎么去除图片边框
  17. js事件冒泡和传播详细解释
  18. 飞凌课堂丨液晶模块的DE和HV模式
  19. 艺赛旗(RPA)UEBA、RPA 客户端设置部门
  20. TensorFlow 决策森林来啦!

热门文章

  1. php 去除开头空格,学习猿地-php怎么去除前面空格
  2. Notepad++ 下载与安装教程
  3. 8Manage PPM项目管理系统独特的功能:项目完整性保护
  4. Python 常见问题 之 python 安装包下载安装速度慢 的 快速解决方法(之一)
  5. 使用系统(win7/win10/windows)压缩/解压缩文件,基于vbs脚本,执行bat批处理
  6. Windows7 Update 无法更新补丁解决方法,IE11浏览器也可以通过更新系统自动安装
  7. 2023最新个人主页源码/精美UI流光风格+也可做团队主页
  8. 华为OJ 初级:合并表记录
  9. nginx启动失败(bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket…permissions)
  10. 外语学习的真实方法与误区30