Quelqu'un peut-il m'aider avec l'objet Mock ci-dessous. Je veux écrire un scénario de test simulé pour la classe ServiceImpl. Je veux me moquer de l'interface OrderIF:
public interface OrderIF{
List<Order> ordersFor(String type);
}
La mise en œuvre du service est:
public class ServiceImpl implements Service {
private List <Order> orders ;
private OrderIF orderif ; // this is 3rd party interface
public int getval(String type) {
//some code
// this returns a list of objects (orders)
orders = orderif.ordersFor(type);
// some code
return orders.get(0)
}
}
Mon code donne NullPoinerException:
public class ServiceImplTest {
private List <Order> ll ;
private service reqService ;
@InjectMocks
private orderIF order;
@Before
public void setUp() throws Exception {
ll = new ArrayList<Order> ();
ll.add(new Order("Buy" , 11 , "USD" ));
ll.add(new Order("Sell" , 22 , "USD" ));
reqService = spy(new ServiceImpl());
}
@Test
public void test() {
String type= "USD" ;
when(order.ordersFor(type)).thenReturn(ll);
q = reqService.getval(type);
assertTrue(q.get().ask == 232.75);
}
}
@InjectMocks
N'instanciera ni ne se moquera de votre classe. Cette annotation est utilisée pour injecter des maquettes dans ce domaine.
Si vous voulez tester serviceImpl
, vous devrez vous moquer de cette façon:
@Mock
private OrderIF order;
@InjectMocks
private Service reqService = new ServiceImpl();
Pour le faire fonctionner, vous devez utiliser runner ou MockitoAnnotations.initMocks(this);
dans la méthode @Before
.
Je suppose que order
est null
et vous obtenez le NullPointerException
ici:
when(order.ordersFor(type)).thenReturn(ll);
Pour @InjectMocks
pour travailler et instancier votre classe, vous devrez ajouter un coureur:
@RunWith(MockitoJUnitRunner.class)
public class ServiceImplTest {
// ...
}
Vous n'avez pas besoin d'utiliser le runner, reportez-vous à la documentation pour les alternatives.