java写抽象类的测试_如何使用JUnit在Java中测试抽象类?
如何使用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中测试抽象类?相关推荐
- java 写文件 权限不够_教你解决Linux系统中JAVA创建文件后权限不足的问题
在作业中,项目使用文件上传. 这个功能很常见. 当Kai Ge今天更改其官方帐户时,他遇到了一个问题,即无法访问下载的文件,也无法通过浏览器访问该文件. 它是怎么发生的? 经过许多问题之后,事实证明这 ...
- python的抽象类详解_第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类...
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不是以继 ...
- java写七星彩兑奖_【技术分享】Java Swing界面完成七星彩抽奖系统
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; ...
- java写一个登录系统_用java写一个用户登陆界面
一.课堂测试源代码及其结果截图 用java的swing写一个用户登录界面,采用网格布局.源代码如下: /** * */ package LiuLijia; import java.awt.CardLa ...
- java 压力测试_使用 JMeter 完成常用的压力测试
讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确是不够的.在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度.影响软件响应速度的 ...
- java类的命名规范_一篇搞定Java命名规范
好的代码本身就是注释,减少不必要的注释 驼峰命名规则 大驼峰命名 类名全部使用大驼峰 ServiceDiscovery.ServiceInstance.LruCacheFactory 小驼峰命名 方法 ...
- kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常
kotlin中的异常处理 by Daniel Newton 丹尼尔·牛顿 如何使用assertFailsWith在Kotlin中测试异常 (How to test exceptions in Kotl ...
- java webservice报文过长_工作1-5年的Java程序猿到底需要怎样的一个技术栈?
工作1-5年的Java程序猿到底需要怎样的一个技术栈? 前言: 具有1-5年开发经验的程序员 需要学习的内容其实还有很多很多. 今天跟大家交流一下希望分享出来的对大家能够有帮助,这是我这些年总结出的一 ...
- java编程控制电脑硬件_如何快速学习AP计算机中的Java编程?
AP Computer Science A (APCSA)考试,需要掌握Java编程语言.对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构. 多编程零基础的高中生,在自学一段时间内, ...
最新文章
- 华东师范大学2019年高等代数考研试题
- Android系统Surface机制的SurfaceFlinger服务的线程模型分析
- 客户资产管理(Custom Asset Management)
- Linux服务器Zookeeper+Dubbo环境搭建
- 通用mapper如何处理多表条件查询通过list封装(强烈不推荐)(一对一,一对多)
- 系统机构设计师 - 软件质量属性
- hadoop--集群时间同步(可不同步)
- Web渗透测试常规套路
- greenplum 替代mysql_转:MySQL到Greenplum迁移分析
- TIOBE 3 月编程语言排行榜:Ruby 重回前十,Kotlin 突围
- 数据之美系列5(转载)
- 通俗易懂的USB协议详解(转)
- Python学习笔记-基础篇
- 基于原理图法的全加器设计
- 张一鸣的大学四年收获及工作感悟
- html中如何使图片边框隐藏,css怎么去除图片边框
- js事件冒泡和传播详细解释
- 飞凌课堂丨液晶模块的DE和HV模式
- 艺赛旗(RPA)UEBA、RPA 客户端设置部门
- TensorFlow 决策森林来啦!
热门文章
- php 去除开头空格,学习猿地-php怎么去除前面空格
- Notepad++ 下载与安装教程
- 8Manage PPM项目管理系统独特的功能:项目完整性保护
- Python 常见问题 之 python 安装包下载安装速度慢 的 快速解决方法(之一)
- 使用系统(win7/win10/windows)压缩/解压缩文件,基于vbs脚本,执行bat批处理
- Windows7 Update 无法更新补丁解决方法,IE11浏览器也可以通过更新系统自动安装
- 2023最新个人主页源码/精美UI流光风格+也可做团队主页
- 华为OJ 初级:合并表记录
- nginx启动失败(bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket…permissions)
- 外语学习的真实方法与误区30