Личная оболочка / примитив / строковое поле - PullRequest
0 голосов
/ 29 января 2020

Мой вопрос не этот вопрос. Я хочу смоделировать частные оболочки поля, такие как Integer и String. Кроме того, эти поля находятся в абстрактном суперклассе.

public abstract class SuperSample
{
    private Integer var1;
    private String var2;

    private Service service;

    pubic boolean foo()
    {
          int a = service.doStuff(var1, var2);
          return subMethod(a);
    }

    protected abstract boolean subMethod(int var);

    public void setVar1(Integer var1)
    {
        this.va1 = var1;
    }

    public Integer getVar1()
    {
        return var1;
    }

    public void setVar2(String var2)
    {
        this.var2 = var2;
    }

    public String getVar2()
    {
        return var2;
    }

    public void setService(Service service)
    {
        this.service = service;
    }

    public String getService()
    {
        return service;
    }
}

public class Sample extends SuperSample
{
    protected boolean subMethod(int var)
    {
        return var%2==0?true:false;
    }
}

Spring. xml -

<bean id="superSample" class="SuperSample" abstract="true">
    <property name="var1" value="2" />
    <property name="var2" value="cool" />
</bean>

<bean id="sample" class="Sample" >
    <property name="service" ref="service" />
</bean>

В моем джунте я не могу высмеивать или шпионить var1 или var2. При шпионаже / издевательстве над var1, var2 я получаю сообщение об ошибке:

org.mockito.exceptions.base.MockitoException: Невозможно издеваться над шпионским классом java .lang.Integer Mockito не может насмехаться / шпионить: - финальные классы - анонимные классы - примитивные типы

Я хочу высмеивать строку -

service.doStuff(var1, var2)

с чем-то вроде -

@UnitTest
public class SampleTest
{
    @Mock 
    private Service service;

    private Integer var1 = 2
    private String var2 = "cool";

    @InjectMocks
    private Sample sample;  

    @Test
    public void test()
    {
        MockitoAnnotations.initMocks(this); 
        Mockito.when(service.doStuff(var1, var2)).thenReturn(5);
    }
}

Ответы [ 3 ]

1 голос
/ 29 января 2020

Основываясь на показанном в данный момент примере, макет может быть введен с помощью элемента set

@UnitTest
public class SampleTest {
    @Mock 
    private Service service;

    private Integer var1 = 2
    private String var2 = "cool";

    @Test
    public void test() {
        //Arrange
        MockitoAnnotations.initMocks(this);

        Sample sample = new Sample();
        sample.setService(service);
        sample.setVar1(var1);
        sample.setVar2(var2);          

        Mockito.when(service.doStuff(var1, var2)).thenReturn(5);

        //Act
        boolean actual = sample.foo();

        //Assert

        //...
    }
}

В идеале, более конструктивный подход SOLID будет заключаться в рефакторинге предметного класса для использования явного принципа зависимости через внедрение конструктора

public class Sample extends SuperSample {

    public Sample(Service service) {
        super.setService(service);
    }

    protected boolean subMethod(int var) {
        return var%2==0?true:false;
    }
}

Разрешение вставлять любые явные зависимости

@UnitTest
public class SampleTest {
    @Mock 
    private Service service;

    private Integer var1 = 2
    private String var2 = "cool";

    @InjectMocks
    private Sample sample;  

    @Test
    public void test() {
        //Arrange
        MockitoAnnotations.initMocks(this); 

        sample.setVar1(var1);
        sample.setVar2(var2);  

        Mockito.when(service.doStuff(var1, var2)).thenReturn(5);

        //Act
        boolean actual = sample.foo();

        //Assert

        //... 
    }
}
1 голос
/ 29 января 2020

Здесь вы go, мы создали расширение JUnit для решения этой конкретной проблемы.

https://github.com/exabrial/mockito-object-injection

1 голос
/ 29 января 2020

Вы можете просто ввести значения самостоятельно, а затем удалить аннотацию @InjectMocks. Лучше всего это сделать с помощью метода установки, помеченного @Before, чтобы он выполнялся для каждого теста.

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    sample = new Sample();
    sample.setVar1(1234);
    sample.setVar2("5678");
    sample.setService(service);
}
...