相关疑难解决方法(0)

不为派生类调用静态初始值设定项

以下Java代码不会调用类的静态初始化程序B.为什么?

码:

class A 
{
    static 
    {
        System.out.println("A static init");
    }

    public static void f() 
    {
        System.out.println("f() called");
    }
}

class B extends A 
{
    static 
    {
        System.out.println("B static init");
    }
}

public class App
{
    public static void main( String[] args)
    {
        B.f(); //invokestatic  #16                 // Method com/db/test/B.f:()V
    }
}
Run Code Online (Sandbox Code Playgroud)

节目输出:

A static init
f() called
Run Code Online (Sandbox Code Playgroud)

在JDK 1.8.0_25上测试过

java

11
推荐指数
2
解决办法
259
查看次数

在JUnit测试期间,静态初始化程序不会运行

我在这里有一个有趣的JUnit问题(JUnit 4.12).我有一个只有静态方法的基类.它们必须是静态的,因为它们的使用方式.我从基类继承了其他类.所以,如果基类是Base,我们有ChildAChildB.

大多数方法都包含在基类中,但它必须知道它实际上是哪个子项(只是调用方法,因为基类是无效的).这是通过基类中的静态数据成员完成的:

public class Base {

    protected static ChildType myType = ChildType.Invalid;
    ...
}    
Run Code Online (Sandbox Code Playgroud)

每个子项都通过静态初始化程序设置数据成员,因此:

static {
    myType = ChildType.ChildA;
}
Run Code Online (Sandbox Code Playgroud)

然后,当调用方法时,基类知道它是什么类型并加载适当的配置(类型实际上是配置名称).

这一切都在运行应用程序时完美运行.在调试器和日志消息中逐步执行它,我可以看到设置了适当的类型,并且方法根据子类型加载适当的配置.

使用JUnit时出现问题.我们有一些JUnit测试来测试每个基类方法.由于仅在基类上调用方法无效,因此我们在子类上调用方法,因此:

bool result = ChildA.methodTwo();
Run Code Online (Sandbox Code Playgroud)

这''总是失败''.为什么?永远不会调用静态初始化程序.将代码作为应用程序运行时,它会被调用,每个人都很高兴.当我将其作为JUnit测试运行时,将跳过静态初始化程序,并且方法具有无效数据.什么是JUnit跳过静态初始化程序?有办法解决吗?

细节

实际上,我们没有像上面发布的那样调用方法.我只想让这个例子尽可能清楚.实际上,我们有一个用Jersey框架编写的Web服务.调用的方法是REST端点之一.

@POST
@Produces(MediaType.TEXT_PLAIN)
public String methodPost() {
    ...
    return new String( itWorked ? "success" : "fail" );
}
Run Code Online (Sandbox Code Playgroud)

我们这样称呼它(对于丑陋的语法感到抱歉,这只是它的工作方式):

@Test
public void testThePost() throws Exception {

    javax.ws.rs.core.Response response = target("restapi/").request().post(Entity.entity(null, MediaType.TEXT_PLAIN));

    assertEquals( 200, response.getStatus() );
}
Run Code Online (Sandbox Code Playgroud)

所有GET测试都可以工作,并且所有这些测试都会调用静态初始化程序.只是这个POST失败了,只有在运行JUnit测试时才会失败.

java unit-testing junit4 jersey-test-framework

6
推荐指数
2
解决办法
887
查看次数

Java中的继承与静态

我不太明白为什么静态方法可以在Java中继承?

继承就像从基类继承AND静态属于Class而不是Object.

因此,如果静态属于类只有为什么它会逐渐渗透到派生类?它不应该只停留在定义它的类中吗?

继承静态方法是一种很好的编程习惯吗?

java oop

2
推荐指数
2
解决办法
4368
查看次数

标签 统计

java ×3

jersey-test-framework ×1

junit4 ×1

oop ×1

unit-testing ×1