То же значение, возвращаемое двумя объектами с теми же интерфейсами Mocked с использованием JMockit

Я сделал простой тестовый класс, чтобы упростить мою настоящую проблему:

открытый класс BidonTest {

@Mocked
IBidon ibidon;

@Mocked
IBidon ibidon2;

@Mocked
Bidon bidon;

@Mocked
Bidon bidon2;

@Test
public void testBidon(){
    new NonStrictExpectations(2, Bidon.class){
        {
            ibidon.doIt(); result = "i: coco";
            ibidon2.doIt(); result = "i: ismael et jordan";
            bidon.doIt(); result = "c: coco";
            bidon2.doIt(); result = "c: ismael et jordan";
        }
    };
    System.out.println(ibidon.doIt());
    System.out.println(ibidon2.doIt());
    System.out.println(bidon.doIt());
    System.out.println(bidon2.doIt());
}


public interface IBidon{
    public String doIt();
}

public class Bidon implements IBidon{
    @Override
    public String doIt(){
        return "toto";
    }
}

}

Ниже результат теста:

i: coco
i: coco
c: coco
c: ismael et jordan

Мой первый вопрос: почему ibidon2 возвращает "coco"? (даже если у меня мало идей, но, может быть, кто-то здесь является экспертом JMockit: D) ​​Мой второй вопрос: как я могу изменить его, чтобы он возвращал «ismael et jordan»?


person TerriJordan    schedule 09.01.2012    source источник
comment
Должно быть просто new NonStrictExpectations(). Параметр int предназначен только для повторной записи ожиданий, а параметр, который принимает литерал Class, предназначен только для частичных динамических имитаций (в этом случае класс Bidon уже имитируется через два поля имитации).   -  person Rogério    schedule 12.01.2012


Ответы (1)


У меня он отлично работает после исправления вашего источника.

package main;

import mockit.Mocked;
import mockit.NonStrictExpectations;
import org.junit.Test;

public class TestBidon {
    @Mocked IBidon ibidon;
    @Mocked IBidon ibidon2;
    @Mocked Bidon bidon;
    @Mocked Bidon bidon2;

    @Test public void testBidon() {
        new NonStrictExpectations() {{
            ibidon.doIt();  result = "i: coco";
            ibidon2.doIt(); result = "i: ismael et jordan";
            bidon.doIt();   result = "c: coco";
            bidon2.doIt();  result = "c: ismael et jordan";
        }};

        System.out.println(ibidon.doIt());
        System.out.println(ibidon2.doIt());
        System.out.println(bidon.doIt());
        System.out.println(bidon2.doIt());
    }
}

Производит:

i: coco
i: ismael et jordan
c: coco
c: ismael et jordan

Какую версию ты используешь? Выше было через 0.999.12.

(Также не уверен, почему вы используете здесь счетчик вызовов, поскольку он зависит от того, является ли он NonStrictInvocation, чтобы избежать утверждения.)

person Dave Newton    schedule 09.01.2012
comment
В настоящее время я использую jmockit 0.999.3. - person TerriJordan; 12.01.2012
comment
@TerriJordan Можете ли вы перейти на текущую версию и попробовать еще раз? - person Dave Newton; 12.01.2012
comment
Попробую обновить версию и потом выложу результат. - person TerriJordan; 12.01.2012
comment
@TerriJordan Я думал, что в вашем коде изначально отсутствовала пара фигурных скобок ("{}"), но, возможно, это была ошибка вырезания и вставки. - person Dave Newton; 12.01.2012
comment
Вы были правы, это была проблема с версией, проблема исправлена ​​​​с обновлением. - person TerriJordan; 17.01.2012
comment
Это решение больше не работает с версией 1.9 jmockit. Он показывает ошибку java.lang.IllegalArgumentException: класс уже издевался: class com.dvag.ki.pim.aufgaben.store.BideonTest$Bidon at com.dvag.ki.pim.aufgaben.store.BideonTest$1.‹init› ... - person Jojo.Lechelt; 18.07.2014