小编ors*_*rsg的帖子

Guice协助注入更深层次的依赖层次结构

我想进行一系列处理元素并通过Guice将它们连接在一起.我们假设以下路径:

  • interface A通过实施class AImpl需要一些输入
  • interface Bclass BImpl需求实施A
  • interface Cclass CImpl需求实施B
  • interface Dclass DImpl需求实施C

A的依赖关系只能在运行时解决,而不能在配置时解决.通常的方法是在这种情况下使用Assisted Injection来创建一个工厂,它将缺少的实例作为参数,如下所示:

public interface AFactory {
    public A createA(String input);
}
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是这样的:

public interface DFactory {
    public D createD(String inputForA);
}
Run Code Online (Sandbox Code Playgroud)

我不想AImpl在整个层次结构中手动传递特定的依赖项.是否可以通过Guice实现这一目标?如果没有,在保留注射效益的同时,优雅地避开这个问题的最佳方法是什么?

java guice

13
推荐指数
1
解决办法
2290
查看次数

具有最小违规边数的循环图的拓扑排序

我正在寻找一种方法来对给定的定向未加权图执行拓扑排序,其中包含循环.结果不仅应包含顶点的排序,还应包含给定排序违反的边集.这组边缘应该是最小的.

由于我的输入图可能很大,我不能使用指数时间算法.如果在多项式时间内无法计算最优解,那么对于给定的问题,什么启发式算法是合理的?

algorithm graph-theory directed-graph topological-sort graph-algorithm

13
推荐指数
1
解决办法
8709
查看次数

与Spock嘲笑slf4j

我有一个带注释的Groovy类@Slf4j,所以它得到一个私有的final Logger log字段,我想测试它的用法.我想继续使用@Slf4j并且不再公开该log字段以便进行测试.

我正在使用Spock 1.0编写测试,并尝试使用Spock的集成模拟和存根功能来完成此操作.全局存根应该帮助我拦截LoggerFactory调用以获取实际Logger实例,所以我目前的猜测是这样的:

LoggerFactory logFactory = GroovyStub(global: true)
logFactory.getLogger(_) >> Mock(Logger)
// create my @Slf4j-annotated object afterwards
Run Code Online (Sandbox Code Playgroud)

有趣的是,拦截实际上有效,println确认该类实际上获得了一个对象Mock for type 'Logger' named 'dummy',但是指示存根返回模拟的第二个语句似乎没有捕获.相反,默认存根行为返回另一个存根,当然不能用于模拟:

org.spockframework.runtime.InvalidSpecException: Stub 'dummy' matches the following required interaction:

1 * plugin.log.warn(_)   (0 invocations)

Remove the cardinality (e.g. '1 *'), or turn the stub into a mock.
Run Code Online (Sandbox Code Playgroud)

我需要更改什么才能让存根LoggerFactory返回模拟Logger

groovy mocking slf4j spock

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