2017-10-31 4 views
3

Ich schreibe einen Test mit Junit + Mockito + Powermock.Kann ich statische Methoden nur mit powermock + mockito + junit ausprobieren?

Ich habe eine Klasse wie folgt, die ich testen wollen:

public class MyUtils { 
    public static Object method1() {} //I want to mock this only 
    public static void method2() {} //I want to keep this as is during my test. 
    public static void method3() {} //I want to keep this as is during my test. 
} 

Ich will nur method1 aber nicht method2 oder method3 verspotten.

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyUtils.class) 
public class MyTest { 

    @Before 
    public void setUpBeforeClass() throws Exception { 
     PowerMockito.mockStatic(MyUtils.class); 
    } 

    @Test 
    public void test1() throws Exception { 
     when(MyUtils.method1()).thenReturn(something); 

     MyUtils.method3(); //method3 is getting mocked with an empty implementation by PowerMockito 
    } 

    ... 
} 

Kann ich einige Methoden verspottet und einige nicht spotten das heißt, sie während des Tests ihre ursprüngliche Implementierung halten? Ist das mit Mockito + Powermock möglich?

Mein Test sieht vielleicht nicht sehr elegant aus, aber ich habe meinen Anwendungsfall vor dem Posten hier vereinfacht.

Vielen Dank.

+0

Mögliches Duplikat von [Mock eine einzelne statische Methode mit PowerMock und TestNG] (https://stackoverflow.com/questions/20398120/mock-a-single-static-method-using-powerermock-and-testng) – Turing85

Antwort

2

Wenn Sie viel mehr Methoden, die Sie mit echten Implementierung halten wollen, als diejenigen, die verspottet werden müssen (vor allem, wenn seine einzige in diesem Fall), dann würde ich für Spion gehen statt Mock:

import static org.powermock.api.mockito.PowerMockito.spy; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyUtils.class) 
public class MyTest { 

    @Before 
    public void setUpBeforeClass() throws Exception { 
     spy(MyUtils.class); 
    } 

    @Test 
    public void test1() throws Exception { 
     doReturn(something).when(MyUtils.class, "method1"); 

     MyUtils.method3(); // this will be a real call 
    } 

    ... 
} 

Nun werden alle Methoden außer method1 mit echter Implementierung aufgerufen.

+0

Keep Sie können den standard doX() nicht verwenden, wenn (mock) .method, wenn der Mock eine Klasse ist und die Methode statisch ist. Bitte verwenden Sie die Version des Setups wie oben. –

3

Ja, es ist möglich, statische Methoden PowerMock und JUnit zu verspotten, wie unten:

import static org.junit.Assert.*; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner;  
import static org.powermock.api.mockito.PowerMockito.*; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(IDGenerator.class) 
public class UserDAOTest { 
@Test 
public void createShouldReturnAUserId() { 

    UserDAO dao = new UserDAO(); 

    mockStatic(IDGenerator.class); 
    when(IDGenerator.generateID()).thenReturn(1); 
    int result = dao.create(new User()); 
    assertEquals(1, result); 
    verifyStatic(); 
} 

} 


public final class IDGenerator { 

static int i; 

public static final int generateID() { 
    return i++; 
} 

} 


public class UserDAO { 

public int create(User user){ 
    int id = IDGenerator.generateID(); 
    //Save the user object to the db 
    return id; 

} 

} 



public class User { 
private int id; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

} 

Hoffe, es hilft!

Verwandte Themen