我想结合使用自定义TestExecutionListener在SpringJUnit4ClassRunner我的测试数据库上运行Liquibase架构设置.我的TestExecutionListener工作正常,但是当我在我的类上使用注释时,测试中的DAO注入不再起作用,至少实例为null.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext-test.xml" })
@TestExecutionListeners({ LiquibaseTestExecutionListener.class })
@LiquibaseChangeSet(changeSetLocations={"liquibase/v001/createTables.xml"})
public class DeviceDAOTest {
...
@Inject
DeviceDAO deviceDAO;
@Test
public void findByCategory_categoryHasSubCategories_returnsAllDescendantsDevices() {
List<Device> devices = deviceDAO.findByCategory(1); // deviceDAO null -> NPE
...
}
}
Run Code Online (Sandbox Code Playgroud)
听众很简单:
public class LiquibaseTestExecutionListener extends AbstractTestExecutionListener {
@Override
public void beforeTestClass(TestContext testContext) throws Exception {
final LiquibaseChangeSet annotation = AnnotationUtils.findAnnotation(testContext.getTestClass(),
LiquibaseChangeSet.class);
if (annotation != null) {
executeChangesets(testContext, annotation.changeSetLocations());
}
}
private void executeChangesets(TestContext testContext, String[] changeSetLocation) throws SQLException, …Run Code Online (Sandbox Code Playgroud) 我真的很喜欢Multimap谷歌番石榴库的类.它是一种地图类型,您可以在其中为键添加多个值,因此它可以有效地从键映射到某种类型的集合.我特别喜欢的是一个Multimaps.index()函数,它接受一个Iterable和一个键函数,并返回一个Multimap组(或索引或映射)的元素,Iterable该函数为每个元素返回的值.
我发现有点奇怪的是Multimap.values()返回一个扁平集合而不是集合集合?因此,对索引函数进行分组会让我失去一次Ì检索值.我可以通过调用Multimap.asMap()然后调用values()来解决这个问题.
有谁知道为什么Multimap行为那样可能有意义?
在构建基于Clojure的Web应用程序时,我遇到了一些困难.这是一个简单的CRUD应用程序,我开始探索Clojure网络生态系统.我正在尝试不同的库,如Hiccup,Enlive,Compojure和Noir(尽管Noir似乎处于弃用的边缘).
我的问题实际上是两个问题.首先是建立clojure网络应用程序的公平缺乏.其次,我需要一些关于创建"丰富"html组件的提示.
我喜欢Clojure的方式是让不同的库一起玩的简易性.用打嗝取代活泼,反之亦然.一切都发挥其单一而简单的作用.与JSF这样的复杂框架有很大不同.
但有一点:这种伟大的自由让我感到有些失落.在JSF中我知道everthing在哪里有它的位置.我使用Spring集成所有组件,Spring-Security来处理所有会话内容.组件库使我免于处理html,javascript和ajax问题的压力.
特别是前面提到的组件库是Clojure所缺少的.我发现自己实现的东西就像数据表一样,具有交替行颜色,分页,列排序,增量过滤等功能.它让我对如何同步这些组件的浏览器和服务器状态提出了疑问,尤其是在包含ajax时.我无法在网上找到任何成熟的答案.
框架的优点:一旦您理解了规则和限制,您就可以构建应用程序并专注于业务规则.处理技术基础设施,不应分散注意力.
对Clojure世界有什么建议?是ClojureScript一个一个解决方案吗?我还没有调查过.有没有人知道任何提供类似功能的组件库,例如RichFaces数据表?有没有一种处理ajax的首选方式?
是否有一种惯用的方法来确定LazySeq是否包含元素?从Clojure 1.5开始,调用contains?抛出IllegalArgumentException:
IllegalArgumentException contains? not supported on type: clojure.lang.LazySeq
clojure.lang.RT.contains (RT.java:724)
Run Code Online (Sandbox Code Playgroud)
在1.5之前,据我所知,它总是返回false.
我知道调用contains?LazySeq可能永远不会返回,因为它可能是无限的.但是如果我知道它不是并且不关心它是否被热切评估呢?
我想出的是:
(defn lazy-contains? [col key]
(not (empty? (filter #(= key %) col))))
Run Code Online (Sandbox Code Playgroud)
但它感觉不太对劲.有没有更好的办法?
是否存在在clojure或fp中实现撤消/重做功能的既定模式?
在OO语言中,我会使用命令模式,但因为它是关于状态我不知道它是否在clojure中是惯用的.
有没有可以提供帮助的图书馆?
当我使用if-let之类的时候
(if-let [a 2 b nil] (+ a b))
Run Code Online (Sandbox Code Playgroud)
我得到一个IllegalArgumentException:
clojure.core/if-let requires exactly 2 forms in binding vector...
Run Code Online (Sandbox Code Playgroud)
类似于when-let ...
这不是我所期望的.If-let可以尝试所有绑定并在一个失败时中断并评估else表达式.
同样的抱怨可以在clojuredocs的评论中找到.我在这里找到了一个并不真正满足的答案,因为海报似乎有一个等同于嵌套的if-let-structure的想法.
有什么理由限制*-let宏的绑定?
更新:由于似乎不清楚,我对if-let的期望是:
我想要一个简单的时间轴组件(如视频编辑软件)用于clojure/seesaw应用程序,我想知道它是一个很好的方法直接用clojure和跷跷板实现这个或者我是否应该在java中编写它并使我的clojure包装器周围.
或者更一般地说:是一种最适合编写UI小部件的函数式编程语言?没有很多国家参与,我无法想象这样做.并不是首先为UI开发发明的OO?
如果设置了自定义属性,我找不到检查前提条件元素的方法.
到目前为止,我发现的这个问题就在这里.正如票证注释所示,如果不修改API ,扩展CustomPrecondition将无济于事.还有另外一种方法吗?
我有一个带文本编辑器的跷跷板ui.编辑器内容由名为"Task"的记录支持,该记录包含在名为"state"的原子中.编辑器上的密钥释放事件应该更改属性:任务的desc.我使用以下代码:
(def state
(atom {:tasks []
:interval nil
:style (style :foreground :black :background nil)}))
(defn on-text-edited [ui listener-fn]
(let [editor (select ui [:#editor])]
(listen editor :key-released
(fn [evt] (listener-fn (text editor))))))
(defn update-task! [task text]
(let [newtask (assoc task :desc text)
tasks (replace {task newtask} (:tasks @state))]
(swap! state
#(assoc % :tasks tasks))))
(def text-updates (on-text-edited frame #(update-task! selected-task %)))
Run Code Online (Sandbox Code Playgroud)
selected-task是一个引用编辑器当前内容模型的atom.每当用户编辑更新任务的文本时!函数应该被调用.但没有任何反应.该函数似乎根本没有被调用.当我从repl调用它时,它的行为与预期一致.
我测试了函数是否会通过让它执行一个简单的println来调用它:
(defn update-task! [task text]
(println (str task " " text)))
Run Code Online (Sandbox Code Playgroud)
现在,当我在编辑器中编辑文本时,该功能正常工作.然后我把它改为:
(defn update-task! [task text]
(let [newtask …Run Code Online (Sandbox Code Playgroud)