2016-11-10 17 views
0

Я пытаюсь проверить класс утилиты с кучей статических методов. Я пишу тест для метода, который вызывает еще два статических метода. По первому статическому методу мышь, похоже, работает, но он игнорирует второе ожидание и вызывает реальный метод. Есть идеи? Я попытался предоставить второй PowerMock.spy (Utils.class) перед вторым ожиданием, но не повезло. Любая идея, как обойти это?PowerMockito и статические методы

вот пример кода.

package com.personal.test; 

import java.io.IOException; 

public class Utils { 

    public static String testUtilOne() { 
     System.out.println("Static method one"); 
     return "methodone"; 
    } 

    public static void testUtilsTwo(String s1, String s2, String s3) throws IOException { 
     throw new IOException("Throw an exception"); 
    } 

    public static void testUtilsThree() throws TestException { 
     try { 
      String s = testUtilOne(); 
      testUtilsTwo("s1", s, "s3"); 
     } catch (IOException ex) { 
      throw new TestException("there was an exception", ex); 
     } 
    } 

    public static class TestException extends Exception { 
     public TestException() { 
      super(); 
     } 
     public TestException(String message, Exception cause) { 
      super(message, cause); 
     } 
    } 
} 


    package com.personal.test; 

import java.io.IOException; 

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

import com.personal.test.Utils.TestException; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Utils.class}) 
public class UtilsTest { 

    @Test 
    public void testMethodThreeWrapsException() throws Exception { 
     PowerMockito.spy(Utils.class); 
     PowerMockito.when(Utils.class, "testUtilOne").thenReturn("This is coming from test"); 
     PowerMockito.spy(Utils.class); 
     PowerMockito.when(Utils.class, "testUtilsTwo", Mockito.anyString(), Mockito.anyString(), Mockito.anyString()).thenThrow(new IOException("Exception from test")); 
     try { 
      Utils.testUtilsThree(); 
     } catch (TestException ex) { 
      Assert.assertTrue(ex.getCause() instanceof IOException); 
      Assert.assertEquals("Exception from test", ex.getMessage()); 
     } 
    } 
} 
+0

Только для записи: только используйте только рамки * Power * для статического насмешка, если вам нужно. Большую часть времени, когда люди просят Powermock ... это потому, что они создали жесткий/невозможный для проверки код; и они думают, что использование Powermock исправит это. Нет, это не будет. Настоящий ответ - применить хорошие методы OO и не использовать Powermock; -.) – GhostCat

ответ

1

Просто в случае, если кто-либо заинтересован, проведя целый день, пытаясь, наконец, решить эту проблему. Я сначала staticMocked мой класс Utils (это будет издеваться над всеми статическими методами), чем попросил mock вызвать реальный метод для вызова testUtilsThree. Изменения приведены ниже.

 package com.personal.test; 

import java.io.IOException; 

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

import com.personal.test.Utils.TestException; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Utils.class}) 
public class UtilsTest { 

    @Test 
    public void testMethodThreeWrapsException() throws Exception { 
     PowerMockito.mockStatic(Utils.class); 
     PowerMockito.when(Utils.class, "testUtilOne").thenReturn("This is coming from test"); 
     PowerMockito.when(Utils.class, "testUtilsTwo", Mockito.anyString(), Mockito.anyString(), Mockito.anyString()).thenThrow(new IOException("Exception from test")); 
     PowerMockito.doCallRealMethod().when(Utils.class, "testUtilsThree"); 
     try { 
      Utils.testUtilsThree(); 
     } catch (TestException ex) { 
      Assert.assertTrue(ex.getCause() instanceof IOException); 
      Assert.assertEquals("Exception from test", ex.getMessage()); 
     } 
    } 
} 
+0

Я хотел бы предложить использовать [ExpectedException] (http://junit.org/junit4/javadoc/4.12/org/junit/rules/ ExpectedException.html) вместо этого попытайтесь блокировать catch для утверждения исключения. –

+0

Спасибо Артур, я использовал try catch, потому что нисходящий код генерирует три разных исключения, которые завернуты в настраиваемое исключение, которое мой примерный код не показывает. Таким образом, в зависимости от того, что GIVEN вниз по потоку, код будет вызывать разные исключения. – ringadingding

 Смежные вопросы

  • Нет связанных вопросов^_^