小编Adr*_*ski的帖子

使用PowerMock和Mockito模拟Logger和LoggerFactory

我有以下Logger我想模拟,但验证日志条目被调用,而不是内容.

private static Logger logger = 
        LoggerFactory.getLogger(GoodbyeController.class);
Run Code Online (Sandbox Code Playgroud)

我想模拟用于LoggerFactory.getLogger()的任何类,但我无法找到如何做到这一点.这是我到目前为止所得到的:

@Before
public void performBeforeEachTest() {
    PowerMockito.mockStatic(LoggerFactory.class);
    when(LoggerFactory.getLogger(GoodbyeController.class)).
        thenReturn(loggerMock);

    when(loggerMock.isDebugEnabled()).thenReturn(true);
    doNothing().when(loggerMock).error(any(String.class));

    ...
}
Run Code Online (Sandbox Code Playgroud)

我想知道:

  1. 我可以模拟静态LoggerFactory.getLogger()以适用于任何类吗?
  2. 我只能似乎运行when(loggerMock.isDebugEnabled()).thenReturn(true);@Before,因此我似乎无法改变每个方法的特点.有没有解决的办法?

编辑发现:

我以为我已经尝试了这个并且它没有用:

 when(LoggerFactory.getLogger(any(Class.class))).thenReturn(loggerMock);
Run Code Online (Sandbox Code Playgroud)

但是,谢谢你,因为它确实有效.

但是我尝试了无数的变化:

when(loggerMock.isDebugEnabled()).thenReturn(true);
Run Code Online (Sandbox Code Playgroud)

我不能让loggerMock改变它的行为,@Before但这只发生在Coburtura上.使用Clover,覆盖率显示为100%,但仍然存在问题.

我有这个简单的课程:

public ExampleService{
    private static final Logger logger =
            LoggerFactory.getLogger(ExampleService.class);

    public String getMessage() {        
    if(logger.isDebugEnabled()){
        logger.debug("isDebugEnabled");
        logger.debug("isDebugEnabled");
    }
    return "Hello world!";
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后我有这个测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest({LoggerFactory.class})
public class ExampleServiceTests {

    @Mock
    private Logger loggerMock;
    private ExampleServiceservice = new ExampleService();

    @Before
    public …
Run Code Online (Sandbox Code Playgroud)

java junit slf4j mockito powermock

56
推荐指数
3
解决办法
9万
查看次数

IntelliJ IDEA升级后的NoClassDefFoundError

最近,我使用IntelliJ IDEA和Gradle创建了一个新项目,用于依赖项管理.解决项目所需的所有依赖项并运行它后,我收到以下错误:

java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
    at com.some.fancy.name.Application.main(Application.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 6 more
Run Code Online (Sandbox Code Playgroud)

只有来自已解析的依赖项的类才会出现问题(我也尝试main使用Cache来自Guava 的简单程序).导致错误的类如下:

@SpringBootApplication
public class Application {
    public static void main(String... args) {
        SpringApplication.run(Application.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

所有字段都显示正确的颜色(注释为黄色,没有任何内容为红色),IntelliJ在External Libraries目录中具有所有已解析的依赖项.我正在使用绿色的"运行"箭头来启动项目.

从命令行使用gradle时,创建一个胖罐然后一切正常.我已经尝试过"无效缓存/重启",从存储库中多次拉出项目,清除了gradle缓存,手动删除了所有依赖项,尝试使用Community Edition,Ultimate Edition运行它,运行已经运行的旧项目前一段时间(现在不工作).

是否可以某种方式将IntelliJ IDEA更新为2016.3.4,构建163.12024.16?

intellij-idea gradle

25
推荐指数
1
解决办法
1万
查看次数

专门基于方法的模板

最近我用Java编写了很多东西,现在我回到了我的C++根源(我真的开始错过了指针和分段错误).知道C++对模板的广泛支持我想知道它是否具有Java的一些功能,这些功能对编写通用代码很有用.让我说我有两组课程.其中一个有first()方法,另一个有second()方法.有没有一种方法可以根据一个类拥有的方法专门化编译器选择的模板?我的目标是类似于Java的行为:

public class Main {
    public static void main(String[] args) {
        First first = () -> System.out.println("first");
        Second second = () -> System.out.println("second");
        method(first);
        method(second);
    }

    static <T extends First> void method(T argument) {
        argument.first();   
    }

    static <T extends Second> void method(T argument) {
        argument.second();
    }
}
Run Code Online (Sandbox Code Playgroud)

在哪里FirstSecond在接口.我知道我可以通过从上层派生出每个组来对这两个组进行分组,但并不总是可行(C++中没有自动装箱,有些类不会从共同的祖先继承).

我需要的一个很好的例子是STL库,其中一些类具有类似的方法,push()而另一些类具有 insert()或者push_back().假设我想创建一个函数,它必须使用可变参数函数将多个值插入到容器中.在Java中,它很容易执行,因为集合具有共同的祖先.另一方面,在C++中并非总是如此.我通过duck-typing尝试了它,但编译器会产生一条错误消息:

template <typename T>
void generic_fcn(T argument) {
    argument.first();
}

template <typename T>
void generic_fcn(T argument) {
    argument.second(); …
Run Code Online (Sandbox Code Playgroud)

c++ generics templates duck-typing

14
推荐指数
2
解决办法
424
查看次数

C++中绝对差值计算的可变块大小和

我想尽可能高效地在C++程序中使用16位整数的二维数组执行绝对差值计算的可变块大小.我对实时块匹配代码感兴趣.我想知道是否有可用的软件库?代码在Windows XP上运行,我使用Visual Studio 2010进行编译.CPU是2核AMD Athlon 64 x2 4850e.

通过可变块大小的绝对差值和(SAD)计算,我的意思如下.

我有一个较小的二维数组,我会称之为template_grid,一个较大的二维数组,我将称之为image.我想找到图像中的区域,该区域最小化模板中像素与图像中区域中像素之间的绝对差值之和.

在C++中计算SAD的最简单方法是:

for(int shiftY = 0; shiftY < rangeY; shiftY++) {
    for(int shiftX = 0; shiftX < rangeX; shiftX++) {
        for(int x = 0; x < lenTemplateX; x++) {
            for(int y = 0; y < lenTemplateY; y++) {
                SAD[shiftY][shiftX]=abs(template_grid[x][y] - image[y + shiftY][x + shiftX]);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

特定阵列大小的SAD计算已在英特尔性能原语库中进行了优化.但是,我正在使用的数组不符合这些库中的大小.

我有两个搜索范围,

范围很大:范围Y = 45,范围X = 10

小范围:rangeY = 4,rangeX = 2

只有一个模板大小,它是:lenTemplateY = …

c++ algorithm computer-vision

8
推荐指数
1
解决办法
1751
查看次数

检查私有静态嵌套类的实例是否

这个问题的标题听起来像是一个很好的思想实验。遗憾的是事实并非如此。让我们假设以下代码结构:

class Outer {
    private static class Inner implements SomeInterface {
        ...
    }
    public static SomeInterface returnInner() {
        return new Inner();
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有一种良好、干净的方法来执行以下检查:

SomeInterface a  = A.returnInner();
if (a instanceof Outer.Inner)
    throw new Error("Ooops, something bad happened");
Run Code Online (Sandbox Code Playgroud)

你认为这不是现实生活中的例子吗?检查类和返回其自己实现的Arrays方法,它恰好是一个(与通常的情况无关- 感谢 Sun 和 Oracle,如果没有你们我会做什么)。我需要检查传递给我的方法的对象是否不是此包装类的实例,因为它没有实现该方法(它使用- 它抛出一个)。asList(T ...)List<T>private static class ArrayList<T>ArrayListadd()AbstractListUnsupportedOperationException

java

8
推荐指数
1
解决办法
1802
查看次数

记忆斐波那契的时间复杂性

我最近遇到了这个Haskell的memoized fibonacci实现:

fibonacci :: Int -> Integer
fibonacci = (map fib [0 ..] !!)
  where fib 0 = 0
        fib 1 = 1
        fib n = fibonacci (n - 1) + fibonacci (n - 2)
Run Code Online (Sandbox Code Playgroud)

我想知道第一次生成第n个斐波纳契数的时间复杂度.因为Haskell中的列表查找,它是O(n ^ 2)吗?如果是,那么有没有办法以某种方式使O(n)像查找操作为O(1)的语言一样?

algorithm performance haskell

6
推荐指数
1
解决办法
888
查看次数

使用 javax.faces.bean.ViewScoped 注解的 bean 时如何失败

有没有办法检测@Named用创建的 CDI-Beans javax.faces.bean.ViewScoped?我多次遇到过这样的情况:IDE 更喜欢这个注释而不是javax.faces.view.ViewScoped.

javax.faces.bean.ViewScoped当找到带注释的 CDI-Bean时,有没有一种好方法可以中止应用程序启动?

jsf cdi

5
推荐指数
1
解决办法
81
查看次数

Haskell将Int与Int - > Int混淆

我最近在Haskell遇到了这个奇怪的问题.下面的代码应该返回一个修剪到一个范围的值(如果它在high它之上它应该返回,high如果它在low它下面应该返回low.

inRange :: Int -> Int -> Int -> Int
inRange low high = max low $ min high
Run Code Online (Sandbox Code Playgroud)

错误消息是:

scratch.hs:2:20:
    Couldn't match expected type ‘Int -> Int’ with actual type ‘Int’
    In the expression: max low $ min high
    In an equation for ‘inRange’: inRange low high = max low $ min high

scratch.hs:2:30:
    Couldn't match expected type ‘Int’ with actual type ‘Int -> Int’
    Probable cause: ‘min’ is applied to …
Run Code Online (Sandbox Code Playgroud)

haskell ghc ghci

3
推荐指数
1
解决办法
124
查看次数