2017-01-16 5 views
3

рассмотрим метод возвращает класс А в моей службе,Есть ли способ издеваться над другими, а затем устанавливать значения вручную в mockito?

public List<A> method(){ 
A a=B.method_b(); 
List<A> list=new ArrayList<>(); 
for(A aa:a){ 
A classA=new A(); 
classA.setVal1(aa.getVal1()); 
list.add(classA); 
} 
     return list; 
    } 

Мой POJO класс

class A{ 
private int val1; 
private int val2; 
. 
. 
. 
. 
private int val10; 
//setter and getter 
} 

так в тесте, я писал

@Mock 
B b; 
@Test 
public void check(){ 
Mockito.when(b.method_b()) 
     .thenReturn(return_A()); 
} 
private A return_A(){ 
A a=new A(); 
a.setVal1(1); 
. 
. 
. 
a.setVal10(10); 
} 

Здесь все работает отлично. Кодовый охват также прекрасен. Но мой вопрос в том, есть ли какой-либо возможный способ избежать выше частного метода, который возвращает класс A с помощью mockito?

+0

Вам не нужно мокето. Просто добавьте 'B' и переопределите' method_b() ', чтобы вернуть свое пользовательское значение. – shmosel

+0

@shmosel плохая идея! какой идентификатор B является интерфейсом и получает новые методы с течением времени? Вам постоянно приходится менять старые unittests ... –

+0

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

ответ

3

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

Существуют разные способы сделать это.

В один из способов настроить DTO так, как вы это делали.

Другой способ - создать входные данные. Но это имеет некоторые downsites:
- вы по-прежнему нужен метод (или класс), чтобы сделать это,
- это делает ваш тест труднее читать и понимать,
- это вводит возможности отказа в тесте, что делает его менее надежным,

еще один способ установить только те значения, которые необходимы для текущего теста в //arrange разделе вашего метода испытаний:

@Mock 
B b; 
@Test 
public void check(){ 
    // arrange 
    Mockito.when(b.method_b()) 
     .thenReturn(return_A()); 
    A a=new A(); 
    // values to be used by cut in this test 
    a.setVal1(1); 
    a.setVal3(3); 

    // act 
    // assert 
} 
+0

Большое спасибо @Timothy Truckle. Итак, вы говорите, что я могу установить значения, необходимые для текущего теста, и нет других вариантов, чтобы избежать ручной установки значений сеттера. – amjeremiad

+0

@Hemalatha * «Итак, вы говорите, что я могу установить значения, необходимые для текущего теста» * да. - * "и нет других вариантов, чтобы избежать ручной установки значений сеттера" * Я говорю "нет * полезно * других параметров ..." –

+0

Я понял. Большое спасибо @Timothy Truckle – amjeremiad

0

Я наткнулся на это http://codearte.github.io/jfairy/ .Это может полезно для обеспечения значения инкубационного если не хотят для установки значений вручную (жестко заданные значения).