PowerMockito tek bir statik yöntemi taklit eder ve nesneyi döndürür


100

M1 ve m2 olmak üzere 2 statik yöntem içeren bir sınıftan statik bir m1 yöntemiyle alay etmek istiyorum. Ve m1 yönteminin bir nesne döndürmesini istiyorum.

Aşağıdakileri denedim

1)

PowerMockito.mockStatic(Static.class, new Answer<Long>() {
         @Override
         public Long answer(InvocationOnMock invocation) throws Throwable {
            return 1000l;
         }
      });

Bu, farklı bir dönüş türüne sahip olan hem m1 hem de m2'yi çağırmaktır, bu nedenle dönüş türü uyuşmazlığı hatası verir.

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l); Ancak m1 yürütüldüğünde bu çağrılmaz.

3) http://code.google.com/p/powermock/wiki/MockitoUsage'danPowerMockito.mockPartial(Static.class, "m1"); aldığım mockPartial'ın mevcut olmadığı derleyici hatası veriyor .

Yanıtlar:


136

Yapmak istediğiniz, 1'in bir kısmı ve 2'nin tamamının bir kombinasyonudur.

Bir sınıfın tüm statik yöntemleri için statik alaylamayı etkinleştirmek için PowerMockito.mockStatic'i kullanmanız gerekir . Bu, onları when-thenReturn sözdizimini kullanarak saplamalarını mümkün kılmak anlamına gelir .

Ancak, kullandığınız mockStatic'in 2 bağımsız değişkenli aşırı yüklemesi, Mockito / PowerMock'un, sahte örneğe açıkça basmadığınız bir yöntemi çağırdığınızda yapması gerekenler için varsayılan bir strateji sağlar.

Gönderen javadoc :

Etkileşimlere verdiği yanıtlar için belirli bir stratejiyle sınıf taklidi oluşturur. Oldukça gelişmiş bir özelliktir ve genellikle düzgün testler yazmak için buna ihtiyacınız yoktur. Ancak eski sistemlerle çalışırken yardımcı olabilir. Varsayılan cevap budur, bu nedenle yalnızca yöntem çağrısını başlatmadığınızda kullanılacaktır.

Varsayılan varsayılan ağaç sökme strateji nesne, sayı için sadece dönüş boş, 0 veya yanlış olduğunu ve değerli yöntemler boolean. 2 argümanlı aşırı yüklemeyi kullanarak, "Hayır, hayır, hayır, varsayılan olarak bu Yanıt alt sınıfının yanıt yöntemini varsayılan bir değer elde etmek için kullanın. Bir Long döndürür, bu nedenle uyumsuz bir şey döndüren statik yöntemleriniz varsa Uzun, bir sorun var.

Bunun yerine, statik yöntemlerin saplamasını etkinleştirmek için mockStatic'in 1-arg sürümünü kullanın, ardından belirli bir yöntem için ne yapılacağını belirtmek için when-thenReturn işlevini kullanın. Örneğin:

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class ClassWithStatics {
  public static String getString() {
    return "String";
  }

  public static int getInt() {
    return 1;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
  @Test
  public void test() {
    PowerMockito.mockStatic(ClassWithStatics.class);

    when(ClassWithStatics.getString()).thenReturn("Hello!");

    System.out.println("String: " + ClassWithStatics.getString());
    System.out.println("Int: " + ClassWithStatics.getInt());
  }
}

Dize değerli statik yöntem, "Merhaba!" Döndürmek için stubb edilirken, int değerli statik yöntem 0 döndüren varsayılan saplamayı kullanır.


1
Tekrar oynamaya gerek yok mu?
Balaji Boggaram Ramanarayan

Hmm ... sorta öyle görünüyor. Belki PowerMockito, PowerMock'u sizin için yeniden oynatır? Ben de merak ediyorum.
djangofan

3
Peki ya bazı statik yöntemin kesin argümanlarla çağrıldığından emin olmam gerekirse?
elTomato

6
@PrepareForTestEk açıklama sınıfı olmalıdır çağrıları statik yöntem değil, statik bir yöntemdir sınıfı.
Hazel Troost

6
@HazelTroost - Hayır, OP doğru. Test için hazırlanması gereken statik yöntemi içeren sınıftır. Yani @PrepareForTest(ClassWithStatics.class)doğru.
arry36
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.