2016-09-28 58 views
0

我有一個junit測試,試圖使用MockUp()和@Mock路徑get(String pathStr)假Paths.get(String pathStr)返回@Mocked路徑路徑; 在JMockit 1.23和1.22這工作得很好,但與JMockit 1.24開始,高達1.28它拋出一個mockit.internal.ClassFile $ NotFoundException,它的闖民宅也爲TestClassName $ 2

new MockUp<Paths>() { 
     @Mock 
     public Path get(String first, String... more) { 
      return path; 
     } 
    }; 

每個更新JMockit看來類刪除功能,但我真的不知道這裏的主要罪惡是什麼。

更新:我現在知道MockUp是一個紅鯡魚,問題是Expectations塊不是作爲匿名內部類創建的。我不知道爲什麼。

UPDATE: 代碼重現:

package foo; 

import mockit.Expectations; 
import mockit.Mock; 
import mockit.MockUp; 
import mockit.Mocked; 
import org.junit.Test; 

import java.io.File; 
import java.nio.file.Files; 
import java.nio.file.LinkOption; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.time.Duration; 

import static org.hamcrest.core.Is.is; 
import static org.hamcrest.core.IsEqual.equalTo; 
import static org.junit.Assert.assertThat; 

public class ReproJMockitBug { 

    private Duration foo(File file, Path path, Duration duration) { 
     final boolean exists = Files.exists(path); 
     if (!exists && Paths.get("").equals(path)) { 
      System.out.print(file.getAbsolutePath()); 
      return duration.plusMinutes(1); 
     } 
     return duration; 
    } 

    @Test 
    public void shouldReturnErrorForInvalidFilePath(@Mocked Duration duration, @Mocked File file, @Mocked Path path) { 
     String pathStr = "/some/test"; 

     new MockUp<Paths>() { 
      @Mock 
      public Path get(String first, String... more) { 
       return path; 
      } 
     }; 

     new MockUp<Files>() { 
      @Mock 
      public boolean exists(Path path, LinkOption... options) { 
       return false; 
      } 
     }; 

     new Expectations() {{ 
      onInstance(duration).plusMinutes(1); 
      result = Duration.ofMinutes(3); 
      onInstance(file).getAbsolutePath(); 
      result = pathStr; 
     }}; 

     assertThat(foo(file, path, duration), is(equalTo(Duration.ofMinutes(3)))); 
    } 

} 
+1

你能展示一個失敗的測試嗎?對我來說,'Paths'的模型在JMockit 1.28上工作正常。 –

+0

@Rogério所以,我剛剛在Github上提出了一個錯誤,問題是Expectations塊沒有被類加載器找到(因此TestClassName爲$ 2)。我希望我能更有幫助,但我無法及時提供可複製的代碼。也許在我的空閒時間裏,我會盡力重現,但我已經花了太多時間在上面,我們很好地保持在1.23。我所知道的是,當您對ClassFile驗證碼進行了一些更改時,無法找到期望匿名內部類,它在1.23但不是1.24下工作。 – Novaterata

+0

@Rogério我添加了代碼來重現 – Novaterata

回答

1

這裏有一個更簡單的再現測試:

@Test 
public void issue350Reproducer(@Mocked File file) { 
    new MockUp<Runnable>() {}; 
} 

因此,使用Expectations是無關緊要的。實際的錯誤是在嘲笑File