JMockit @Tested поле с конкретным конструктором - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь издеваться над классом с JMockit 1.45. Поскольку метод Deencapsulation.setField удален, я не могу установить значение частного поля. Поэтому я ищу способ установить значение частного поля во время инициализации класса. Я добавил дополнительный конструктор для установки значения частного поля. Но я не могу найти способ получить правильно установленный экземпляр с аннотацией @Tested с конкретным Конструктором. Есть ли другой способ сделать это?

"long maxSizeByte" должен быть установлен Конфигурацией, и мне нужно проверить, работает ли метод с различными значениями.

Образец кода Класс производства

public class MagazineFetcher {  

    @EJB private StatisticDAO statisticDao;

    // configs
    private long maxSizeByte;

    public MagazineFetcher() {
        this(ProjectConfig.getCdsMaxChannelSizeByte());
    }
    // This constructor is adde for a testcase to set the private value
    public MagazineFetcher(long maxSizeByte) {
        this.maxSizeByte = maxSizeByte;
    }

    // using maxSizeByte field for a calcuation and validation      
    public void doSomething(){
    }
}

Контрольный пример

public class MagazineFetcherTest {
    @Injectable private StatisticDAO statisticDao;

    @Tested private MagazineFetcher magazineFetcher ;

    @Test
    public void testInvalidImportFile() throws Exception {

        magazineFetcher.doSomething();
    }
}

Кажется, @Tested private MagazineFetcher magazineFetcher создается только конструктором по умолчанию. Я ищу способ, инициированный другим конструктором. Когда я просто MagazineFetcher magazineFetcher = new MagazineFetcher(100 * 1024), я получаю экземпляр, который statisticDao не вводится.

1 Ответ

0 голосов
/ 25 марта 2019

Я не хочу менять производственный код для запуска тестового набора JMockit. Но мне пришлось добавить метод, чтобы издеваться над ним. Буду признателен, если вы поймете что-нибудь получше.

public class MagazineFetcher {  

    @EJB private StatisticDAO statisticDao;

    // configs
    private long maxSizeByte;

    // Method is added only for Testcase
    long getMaxSizeByte() { return maxSizeByte;  }

    public MagazineFetcher() {
        maxSizeByte = ProjectConfig.getCdsMaxChannelSizeByte();
    }
    // No need to add a constructor
    // public MagazineFetcher(long maxSizeByte) {
    //  this.maxSizeByte = maxSizeByte;
    // }

    public void doSomething(){
        // using maxSizeByte field is replaced by getMaxSizeByte() 
        if ( ... < getMaxSizeByte() ) 
            ....
    }
}

Контрольный пример

public class MagazineFetcherTest {
    @Injectable private StatisticDAO statisticDao;

    @Tested private MagazineFetcher magazineFetcher ;

    @Test
    public void testInvalidImportFile() throws Exception {

        new MockUp<MagazineFetcher>(){
            @Mock
            long getMaxSizeByte() {
                return 1024 * 1024 * 250;
            }
        };

        magazineFetcher.doSomething();
    }
}
...