Издевательские методы не выполняются?

Вот мой исходный код.

public class Config{
  private Long id;
  private ConfigService configService;
  public Config(Long id){
    this.id=id;
  }
  public setConfigService(ConfigService configService){
    this.configService=configService;
  }
  public ConfigService  getConfigService(){
    return configService;
  }
  public void callingService(){
    ManagedElInterface mei = null
    mei=getConfigService().getIdsFromConfigService(getId());
    //...
  }
  private Long getId(){
  return id;
  }
}

я издевался

mei=getConfigService().getIdsFromConfigService(getId());

но я вижу ноль в "мэй"

Ниже приведен мой тестовый класс, в котором я использовал EasyMock для насмешек.

public class TestConfig{
  @Test
  public void testcallingService{
  Config config=new Config(12345l);
  ConfigService configService =EasyMock.createMock(ConfigService .class);
  config.setConfigService (ConfigService );
  ManagedElInterface mei=new ManagedElInterface();
  //here i mocked 
  EasyMock.expect(configService.
  getIdsFromConfigService(EasyMock.anyLong()))
  .andReturn(mei);
  config.callingService();
  }
}

Класс службы конфигурации:

    public class ConfigService{
      public ManagedElInterface getIdsFromConfigService(Long l){
        //database code
       return new ManagedElInterface();
      }
    }

Класс ManagedElInterface:

  public class ManagedElInterface{
     //data
    }

Здесь КонфигСервис — это класс, имеющий getIdsFromConfigService (длинный l). Я не хочу выполнять эти методы, поэтому хочу издеваться. getConfigService().getIdsFromConfigService(getId()); возвращает объект класса УправляемыйЭльИнтерфейс, поэтому я создал объект для ManagedElInterface и возвращение с моими данными. Можете ли вы дать понять, что я делаю неправильно. заранее спасибо

где ты это издевался?

Stultuske 15.05.2019 07:47

Все, что я вижу для имитации, это: EasyMock.expect(configArchiveManager. getMEIObjectByMNEId(EasyMock.anyLong())) .andReturn(mei);

Stultuske 15.05.2019 07:49

@Stultuske обновлено

mae 15.05.2019 07:51

конечно. И вы изменили его на код, который никогда не скомпилируется, поскольку теперь вы используете несуществующую переменную с именем configArchiveManager.

Stultuske 15.05.2019 07:51

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

Stultuske 15.05.2019 08:02

@Stultuske Добавлен полный код.

mae 15.05.2019 08:33

Я могу заверить вас, на первый взгляд: это все равно не скомпилируется. Мне удалось получить более простую версию того, что вы пытаетесь сделать для работы (с JUnit 5, не знаю, какую версию вы используете), я опубликую это как ответ.

Stultuske 15.05.2019 08:35

1.10.19 мокито, 4.9.0 июня.

mae 15.05.2019 08:44

о чем ты говоришь, Мокито? согласно вашему коду, вы используете EasyMock?

Stultuske 15.05.2019 08:49

Давайте продолжить обсуждение в чате.

mae 15.05.2019 08:51

Обсуждения нет. в принципе, вы можете скопировать и вставить то, что я сделал ниже (с обновленными версиями), и изменить тест, чтобы он соответствовал вашим требованиям. Mockito и EasyMock могут быть имитирующими фреймворками, вы не можете получить классы EasyMock из зависимости Mockito. Вы по какой-то причине смешиваете зависимости. С моим ответом ниже должно быть довольно легко заставить ваши тесты работать

Stultuske 15.05.2019 08:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
11
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

КонфигСервис:

public class ConfigService {    
    public String getId(Long id) {
        return "hardcoded";
    }
}

Конфигурация

public class Config {

    private Long id;
    private ConfigService service;

    public Config(Long id) {
        this.id = id;
    }

    public void setConfigService(ConfigService configService){
        this.service=configService;
    }

    public String callingService() {
        String result = this.service.getId(id);
        System.out.println("result = " + result + " for id: " + id);
        return result;
    }
}

Тесты

import org.easymock.EasyMockSupport;
import org.junit.jupiter.api.Test;

import static org.easymock.EasyMock.expect;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class ConfigTest extends EasyMockSupport {
    // have your testClass extend EasyMockSupport, and use that to create your mock

    private ConfigService service;

    @Test
    public void testCallingService() {
        Config config=new Config(12345l);
        service = createMock(ConfigService.class);
        // as said before, use the createMock method you inherit
        config.setConfigService (service );
        expect(service.getId(12345l)).andReturn("mocked");
        expect(service.getId(17L)).andReturn("smaller");
        replayAll(); // don't forget the replayAll();
        String result = config.callingService();
        assertEquals( "mocked", result);
        Config config2 = new Config(17L);
        config2.setConfigService(service);
        String result2 = config2.callingService();
        assertEquals( "smaller", result2);
        verifyAll(); // to end your test which uses a mock
    }

    // Simple test without the mock to show the difference
    @Test
    public void testNonMocked() {
        Config config = new Config(50L);
        config.setConfigService(new ConfigService());
        String result = config.callingService();
        assertEquals("hardcoded", result);
    }
}

Зависимости, которые я использовал для тестов

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.5.0-M1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.5.0-M1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.5.0-M1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.easymock</groupId>
    <artifactId>easymock</artifactId>
    <version>4.0.2</version>
    <scope>test</scope>
</dependency>

@mae вносите изменения не в мой ответ, а в свой локальный код. Если вы сделаете это в моем ответе, когда пытались его отредактировать, это сделает тест вместе с ним некомпилируемым и в основном сломает пример в ответе.

Stultuske 15.05.2019 09:04

спасибо за ваше терпение. Что бы вы ни сделали, это основное, что я могу понять, но вопрос в другом, поэтому я не могу этого сделать (ошибок компиляции нет).

mae 15.05.2019 09:12

получил ответ. Забудьте использовать replayAll();. Спасибо @Stultuske

mae 15.05.2019 09:14

Другие вопросы по теме