如何测试无抽象方法的抽象类中的非抽象方法?
如何测试无抽象方法的抽象类?
嘿,这个问题问得好!首先明确一点:你没法直接把抽象类导入测试类然后像普通类那样实例化测试——哪怕它没有任何抽象方法,Java的抽象类本质就是为了被继承设计的,不允许直接new出实例。
不过别担心,有几种简单的方式可以测试这类抽象类,下面结合你的示例代码来一步步说明:
方法1:创建极简的测试子类(匿名内部类)
因为你的抽象类没有任何抽象方法,子类不需要实现额外逻辑,只需要“占位”让我们能实例化它就行。用JUnit的话,测试代码可以这么写:
import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class SomeAbstractClassTest { @Test public void testDoSomethingToUrl() { // 创建匿名内部类实例,直接继承抽象类即可 SomeAbstractClass testInstance = new SomeAbstractClass() {}; String inputUrl = "http://example.com"; String expectedUrl = "http://example.com/takeMeSomewhereNice"; // 注意:你的示例里doSomethingToUrl方法没有return,实际测试记得补上return url; String result = testInstance.doSomethingToUrl(inputUrl); assertEquals(expectedUrl, result); } @Test public void testDbUrlProperty() { // 先设置系统属性,模拟db.url的值 System.setProperty("db.url", "localhost:8080"); // 同样用匿名内部类实例 SomeAbstractClass testInstance = new SomeAbstractClass() {}; // 因为dbUrl是private静态变量,需要用反射来获取(或者考虑给它加个protected getter更优雅) try { java.lang.reflect.Field field = SomeAbstractClass.class.getDeclaredField("dbUrl"); field.setAccessible(true); String dbUrlValue = (String) field.get(null); // 静态变量用null作为实例参数 assertEquals("localhost:8080", dbUrlValue); } catch (Exception e) { e.printStackTrace(); fail("Failed to access dbUrl field"); } } }
方法2:用Mockito直接Mock抽象类
如果你的项目里用了Mockito框架,那更省心——它可以直接帮你生成抽象类的实例,不需要手动写子类:
import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; import static org.junit.Assert.assertEquals; @RunWith(MockitoJUnitRunner.class) public class SomeAbstractClassTest { @Test public void testDoSomethingToUrl() { // 创建调用真实方法的抽象类mock实例 SomeAbstractClass testInstance = org.mockito.Mockito.mock( SomeAbstractClass.class, org.mockito.Mockito.CALLS_REAL_METHODS ); String inputUrl = "http://test.com"; String expected = "http://test.com/takeMeSomewhereNice"; String result = testInstance.doSomethingToUrl(inputUrl); assertEquals(expected, result); } }
这种方式适合快速搭建测试环境,尤其是当抽象类依赖其他组件时,Mockito还能帮你mock掉那些依赖,聚焦测试目标方法。
额外提醒:关于静态变量dbUrl
因为dbUrl是static final的,它的值在类加载时就会被初始化。如果你的测试需要覆盖不同的db.url值,记得在测试前设置System.setProperty,测试后清理属性(比如用System.clearProperty("db.url")),避免影响其他测试用例。
总结一下:核心思路就是先获取抽象类的实例(通过子类或mock),然后像测试普通类一样调用它的公共方法——毕竟你的抽象类已经有具体的方法实现,这些都是可以直接测试的。
内容的提问来源于stack exchange,提问作者physicsboy
相关产品推荐
相关产品推荐

