Отладка частичного макета в JMockit

Можно ли использовать JMockit 0.999.4 и JDK6 для отладки частично смоделированного класса?

Рассмотрим следующий тест:

@Test
public void testClass() {
    SampleClass cls = new SampleClass();

    System.out.println(cls.getStaticInt());
    cls.setVal(25);
    System.out.println(cls.getVal());
}

static class SampleClass {
    static int staticInt = 5;
    private int val;

    {
        staticInt = 10;
    }

    public int getStaticInt() {
        System.out.println("Returning static int and adding a line for debugging");
        return staticInt; 
    }

    public void setVal(int num) {
        System.out.println("Setting val and adding a line for debugging");
        this.val = num;
    }

    public int getVal() {
        System.out.println("Returning val and adding a line for debugging");
        return this.val;
    }
}

Размещение точки останова на каждой строке sysout в SampleClass и отладка "Step Over" в Eclipse приведет к входу в методы SampleClass.

Рассмотрим следующее, что не позволит статическому инициализатору установить для staticInt значение 10.

@Test
public void testClass(@Mocked(methods = "$clinit") SampleClass cls) {       

    System.out.println(cls.getStaticInt());
    cls.setVal(25);
    System.out.println(cls.getVal());
}

static class SampleClass {
    static int staticInt = 5;
    private int val;

    {
        staticInt = 10;
    }

    public int getStaticInt() {
        System.out.println("Returning static int and adding a line for debugging");
        return staticInt; 
    }

    public void setVal(int num) {
        System.out.println("Setting val and adding a line for debugging");
        this.val = num;
    }

    public int getVal() {
        System.out.println("Returning val and adding a line for debugging");
        return this.val;
    }
}

Однако этот код не будет отлаживать методы в SampleClass.

Да, я пробовал свойство -javaagent.


person ctran    schedule 27.01.2011    source источник


Ответы (1)


Ответ Роджерио в группе обсуждения Google JMockit.

JVM отбрасывает точки останова, установленные для класса после его переопределения (что JMockit делает всякий раз, когда класс имитируется).

Чтобы сбросить точки останова, остановите отладчик на тестовом методе непосредственно перед входом в тестируемый код. То есть установите точку останова в тестовом методе на строке, которая вызывает «SampleClass» в этом примере.

person ctran    schedule 31.01.2011
comment
Для любопытных, это ссылка на ошибку JVM: bugs.openjdk.java.net/browse /JDK-7036136 - person The Alchemist; 27.06.2014
comment
Я даже не могу установить точку останова непосредственно в тестовом методе JUnit. Я использую jdk 1.8 и Eclipse Mars (4.5.1). Есть ли у кого-нибудь еще такая же проблема и ее решение? - person Joern; 03.05.2016
comment
Теперь я нашел разницу с приведенным выше тестом. Я использую аннотацию @Tested для метода-члена. Если я заменю это созданием SUT вручную в методе @Before, точки останова в тестовом классе будут работать правильно. - person Joern; 03.05.2016