2016-12-05 10 views
6

Usuwam Powermock z projektu, nad którym obecnie pracuję, więc próbuję przepisać niektóre istniejące testy jednostkowe tylko z Mockito (mockito-core-2.2.28).Mock ostatniej klasy z Mockito 2

Kiedy wykonać test, mam następujący błąd:

org.mockito.exceptions.base.MockitoException:

Cannot mock/spy class com.ExternalpackagePath.Externalclass

Mockito cannot mock/spy because :

  • final class

Wiem, że to pytanie zostało już zadane (How to mock a final class with mockito, Mock objects calling final classes static methods with Mockito), ale nie mogę znaleźć odpowiedzi szukam dla.

Oto fragment mojego kodu:

public class MyClassToTest extends TestCase { 
    private MyClass myClass; 
    @Mock private Externalclass ext; // This class is final, I would like to mock it 

    @Override 
    protected void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); // <<<< The exception is thrown here 
     ext = Mockito.mock(Externalclass.class); 
    } 
} 

Jak wspomniano w dokumentacji Mockito (https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2, §Mock unmockable), dodałem plik org.mockito.plugins.MockMaker. Jest to drzewo mojego projektu:

  • projektu
    • src
      • com.packagePath.myPackage
        • myClass
    • testowe
      • com.packagePath.myPackage
        • myClassToTest
      • zasoby
        • Mockito-extensions
          • org.mockito.plugins.MockMaker

ja też próbuje umieścić w katalogu „Zasoby” w „src”, w podkatalogu o nazwie „test”, ale wynik jest wciąż ten sam.

Myślałem, że kpina z finału była możliwa dzięki Mockito v2. Czy ktoś ma pojęcie o tym, czego tu brakuje?

Dzięki!

+0

Plik musi mieć nazwę org.mockito.plugins.MockMaker, a nie org.mockito.plugins. –

+0

Woops, przepraszam, zapomniałem końca linii, kiedy zrobiłem kopię/przeszłość, nazwa pliku jest dobrze napisana w moim przypadku. Mój zły! Edytowałem opis tekstowy. – Ptiseb

Odpowiedz

7

Cóż, znalazłem tutaj, co jest nie tak, może być przydatne dla innych osób. Moje drzewo projektu jest błędne, umieszczam plik org.mockito.plugins.MockMaker w katalogu "rozszerzenie mockito" bezpośrednio w "src".To jest moje drzewo teraz:

  • Projet
    • src
      • com.packagePath.myPackage
        • myClass
      • Mockito-extensions
        • org.mockito.plugins.MockMaker
  • Test
    • com.packagePath.myPackage
      • myClassToTest
+1

Nie powinieneś dodawać "MockMaker" do swojego "głównego" zestawu źródłowego. –

1

Wygląda na to, że miałeś problem z klasą klasy, tak jak ja.

poprzedniej konfiguracji będzie również pracował, ale wydaje się, że

project/test/resources 

nie był w ścieżce klas.

Miałem ten sam problem, gdy próbowałem uruchomić to z IntelliJ. Po prostu zaznaczyłem katalog zasobów jako Korzeń Zasobów Testowych i wszystko działało dobrze. Chwalcie bogów Mockito!

+0

To zrobiło to dla mnie! – breezymri

13

Dziwne, że Twoje rozwiązanie wydaje się działać.
Według ich dokumentacji na Github mówi.

Mocking of final classes and methods is an incubating, opt-in feature. It uses a combination of Java agent instrumentation and subclassing in order to enable mockability of these types. As this works differently to our current mechanism and this one has different limitations and as we want to gather experience and user feedback, this feature had to be explicitly activated to be available ; it can be done via the mockito extension mechanism by creating the file src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker containing a single line:

mock-maker-inline 

After you created this file, Mockito will automatically use this new engine and one can do :

final class FinalClass { 
    final String finalMethod() { return "something"; } 
} 

FinalClass concrete = new FinalClass(); 

FinalClass mock = mock(FinalClass.class); 
given(mock.finalMethod()).willReturn("not anymore"); 

assertThat(mock.finalMethod()).isNotEqualTo(concrete.finalMethod()); 

In subsequent milestones, the team will bring a programmatic way of using this feature. We will identify and provide support for all unmockable scenarios. Stay tuned and please let us know what you think of this feature!

Moja struktura robocza wygląda teraz tak.

enter image description here

7

nie mogłem go uruchomić z pliku konfiguracyjnego, albo; Zespół Mockito jest jednak bardzo miły i zapewnia wstępnie skonfigurowany artefakt Mockito, który nie wymaga konfiguracji w projekcie docelowym.

Tak więc, jeśli użyć Gradle i chcą przetestować swój kod Kotlin, wystarczy dodać to do zależności Twojego projektu:

testCompile 'org.mockito:mockito-inline:2.8.9' 
testCompile('com.nhaarman:mockito-kotlin:1.5.0') { 
    exclude group: 'org.jetbrains.kotlin' 
    exclude group: 'org.mockito' 
} 
+0

Dziękujemy za opublikowanie tego. –

+0

Co robi grupa wykluczeń w tym przypadku? – rozina

+0

Zapewnia to, że wstawiona wersja, do której się tutaj odwołujesz, nie jest przesłonięta przez przejściową zależność 'mockito-kotlin', która jest tu również rysowana. –

0

To rozwiązanie pracował dla mnie: Zamiast

testCompile "org.mockito:mockito-android:2.9.0" 

w plik gradle, należy go zamienić na:

testCompile group: 'org.mockito', name: 'mockito-inline', version: '2.9.0' 

i będzie działać.